这里有一个函数可以为您解决这个问题。它创建了一个加权数组,您可以将其与随机数一起使用,以根据每个项目的加权值正确加权。
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 和总数之间的随机数。
然后它遍历加权数组,将这些值相加,以找到第一个超过随机数的累积值。当它找到时,这就是被选中的插槽。