weighted()

更新日: 2018-09-04

weighted()

// 使い方
chance.weighted(['a', 'b'], [100, 1])
chance.weighted(['a', 'b', 'c', 'd'], [1, 2, 3, 4])

データの配列と、重みを指定する配列を渡すことで、 指定した重みに従って、ランダムに1つのデータを取得します。

例えば、以下の場合、

chance.weighted(['a', 'b'], [100, 1]);
=> 'a'

abよりも100倍の頻度で選択されます。 しかし、どちらもランダムです。

重みは全ての相対値であるため、 2つ以上のデータが指定されている場合は、 全てのデータが重みに基づいて選択されます。


例えば、以下の場合、

chance.weighted(['a', 'b', 'c', 'd'], [1, 2, 3, 4]);
=> 'c'

配列から文字を取得する際に、 aの2倍の頻度でbが選択され、 aの3倍の頻度でcが選択され、 aの4倍の頻度でdが選択され、 bの2倍の頻度でdが選択されます。


重みは整数または、小数を指定することができます。

chance.weighted(['a', 'b', 'c', 'd'], [0.1, 0.2, 0.3, 0.4]);
=> 'd'

重みは特に合計して意味のある数値にする必要はありません。 全て相対的に扱うので、以下の全てが同等になります。

chance.weighted(['a', 'b', 'c', 'd'], [1, 2, 3, 4]);
chance.weighted(['a', 'b', 'c', 'd'], [0.1, 0.2, 0.3, 0.4]);
chance.weighted(['a', 'b', 'c', 'd'], [100, 200, 300, 400]);
chance.weighted(['a', 'b', 'c', 'd'], [17, 34, 51, 68]);
chance.weighted(['a', 'b', 'c', 'd'], [0.17, 0.34, 0.51, 0.68]);

思い出してください。 JavaScriptはファーストクラスの関数があるので、 以下のように指定することもできます。

chance.weighted([chance.fbid, chance.twitter, chance.ip], [10, 5, 1])();
=> 10000345166213

上記は、重みに基づいてChanceメソッドが選択され、選択されたメソッドを即時実行します。 そのため、fbidはtwitterユーザー名の2倍(10/5 = 2)、 ipの10倍(10/1 = 10)の頻度で返されます。 また、twitterユーザー名はipの5倍(5/1 = 5)の頻度で返されます。


デモ

ボタンを押すと、重みに合わせて天気を表示します。

結果:
JavaScript
var button = document.getElementById('get-result');
button.addEventListener('click', function() {
  var chance  = new Chance();
      items   = ['はれ☀', 'くもり☁', 'あめ☔', 'ゆき⛄'];
      weights = [50, 20, 30, 10];
  document.getElementById('result').innerHTML = chance.weighted(items, weights);
}, false);
HTML
<button id="get-result">結果表示</button>
<div>
  <span>結果:</span>
  <span id="result"></span>
</div>

© 2015 Victor Quinn Released under the MIT license

このコンテンツはVictor Quinn(victorquinn)によるChanceドキュメントを翻訳/改変したものです。