JavaScriptでランダムに偏りを持たせる

JavaScriptでランダムに偏りを持たせる方法について調べてみたのでメモ。

サンプルコード

まずは配列内のA~Fから1つ選択するようにしてみます。

JavaScript

var data = ['A', 'B', 'C', 'D', 'E', 'F'];

var getData = choose_at_random(data);
console.log(getData);

/**
 * 配列の値からランダムで1つ選択して返す
 * @param arr arrayData (required) 選択する配列の内容
 * @return str
 */
function choose_at_random(arrayData) {
	var arrayIndex = Math.floor(Math.random() * arrayData.length);
	return arrayData[arrayIndex];
}

配列内から1つ選択するデモページ

上記サンプルを500回実行して、その結果をconsokeに表示させてみます。

JavaScript

var data = ['A', 'B', 'C', 'D', 'E', 'F'];

var res = [];
for (var i = 0; i < 500; i++) {
	res[i] = choose_at_random(data);
}
statistics_count(data, res);

/**
 * 配列の値からランダムで1つ選択して返す
 * @param arr arrayData (required) 選択する配列の内容
 * @return str
 */
function choose_at_random(arrayData) {
	var arrayIndex = Math.floor(Math.random() * arrayData.length);
	return arrayData[arrayIndex];
}

/**
 * 配列内に各値がどのくらいあるのかをconsoleに表示する
 * @param arr basicData       (required) 調べる元になる配列
 * @param arr measurementData (required) 調べる内容の配列
 */
function statistics_count(basicData, measurementData) {
	for (var i = 0; i < basicData.length; i++) {
		var counter = '';
		for (var j = 0; j < measurementData.length; j++) {
			if(measurementData[j] === basicData[i]) {
				counter = counter + '■';
			}
		}
		console.log(basicData[i], counter);
	}
}

console内の黒いラインが実行回数になります。
多少ばらつきがあることもありますが、だいたい同じくらいになっているかと思います。
実行結果をconsokeに表示するデモページ
 

配列内を変更して、A~Fにそれぞれの割合を設定するようにしてみます。

JavaScript

var data = [
	{
		'name': 'A',
		'ratio': 4.1
	}, {
		'name': 'B',
		'ratio': 19.0
	}, {
		'name': 'C',
		'ratio': 25.6
	}, {
		'name': 'D',
		'ratio': 25.0
	}, {
		'name': 'E',
		'ratio': 17.2
	}, {
		'name': 'F',
		'ratio': 6.6
	}
];

var res = [];
for (var i = 0; i < 500; i++) {
	res[i] = choose_at_random(data);
}
statistics_count(data, res);

/**
 * 配列の値からランダムで1つ選択して返す
 * @param arr arrayData (required) 選択する配列の内容
 * @return str
 */
function choose_at_random(arrayData) {
	var ratioArr = [];
	for (var i = 0; i < arrayData.length; i++) {
		var ratio = arrayData[i]['ratio'] * 10;
		for (var j = 0; j < ratio; j++) {
			ratioArr.push(arrayData[i]['name']);
		}
	}
	var arrayIndex = Math.floor(Math.random() * ratioArr.length);
	return ratioArr[arrayIndex];
}

/**
 * 配列内に各値がどのくらいあるのかをconsoleに表示する
 * @param arr basicData       (required) 調べる元になる配列
 * @param arr measurementData (required) 調べる内容の配列
 */
function statistics_count(basicData, measurementData) {
	for (var i = 0; i < basicData.length; i++) {
		var counter = '';
		for (var j = 0; j < measurementData.length; j++) {
			if(measurementData[j] === basicData[i]['name']) {
				counter = counter + '■';
			}
		}
		console.log(basicData[i]['name'], counter);
	}
}

CやDが全体的に多く、逆にAやFは少なめになりました。
配列の各値に割合を持たせるのデモページ
 

サンプルを変更して、指定した範囲の中央部分に偏りを持たせるようにしてみます。

JavaScript

var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

var res = [];
for (var i = 0; i < 1000; i++) {
	res[i] = get_random_int_biased_at_center(1, 20);
}
statistics_count(data, res);

/**
 * 中央に偏りのある乱整数を返す
 * @param num min (required) 範囲の最小値
 * @param num max (required) 範囲の最大値
 * @return str
 */
function get_random_int_biased_at_center(min, max) {
	return (get_random_int(min, max) + get_random_int(min, max)) / 2;
}

/**
 * 指定範囲内の乱整数を返す
 * @param num min (required) 範囲の最小値
 * @param num max (required) 範囲の最大値
 * @return str
 */
function get_random_int(min, max) {
	return Math.floor( Math.random() * (max - min + 1) ) + min;
}

/**
 * 配列内に各値がどのくらいあるのかをconsoleに表示する
 * @param arr basicData       (required) 調べる元になる配列
 * @param arr measurementData (required) 調べる内容の配列
 */
function statistics_count(basicData, measurementData) {
	for (var i = 0; i < basicData.length; i++) {
		var counter = '';
		for (var j = 0; j < measurementData.length; j++) {
			if(measurementData[j] === basicData[i]) {
				counter = counter + '■';
			}
		}
		console.log(basicData[i] + ' ' + counter);
	}
}

中央部分に偏りを持たせるデモページ
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

1件のコメント

  1. […] を持たせる – cly7796.net サイト制作に関するメモ書き https://cly7796.net/blog/javascript/make-random-bias/ […]

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2021年11月
 123456
78910111213
14151617181920
21222324252627
282930