これを解決する関数を次に示します。重み付けされた値ごとに各アイテムを適切に重み付けするために、乱数で使用できる重み付け配列を作成します。
var campaigns = {"c1":4, "c2":8, "c3":24};
function getWeightedRandomCampaign(list) {
var weighting = [];
var total = 0;
for (var item in list) {
weighting.push({key: item, value: list[item]});
total += list[item];
}
// generate random number between 1 and total
var rand = Math.floor(Math.random() * total);
// figure out which weighted slot it fits in
var cum = 0;
for (var i = 0; i < weighting.length; i++) {
cum += weighting[i].value;
if (rand < cum) {
return(weighting[i].key);
}
}
return(weighting[weighting.length - 1]);
}
ここで動作することがわかります: http://jsfiddle.net/jfriend00/ffwqQ/
仕組みは次のとおりです。
キャンペーン オブジェクトと加重値から始めます。
var campaigns = {"c1":4, "c2":8, "c3":24};
次に、次のような一時データ構造を構築します。
var weighting = [{key: "c1", value: 4}, {key: "c2", value: 8}, {key: "c3", value: 24}];
そのデータ構造を作成している間、すべての重量値の現在の合計を追跡します。
次に、0 からその合計までの乱数を作成します。
次に、重み付け配列を調べて値を加算し、乱数を超える最初の累積値を見つけます。それが見つかった場合、これが選択されたスロットです。