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]; }
上記サンプルを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); } }
【参考サイト】
コメントが承認されるまで時間がかかります。