在一个通用的方式;我想你加权随机数发生器之后是:
function weightedRandomNumber(weights) {
var sum = 0;
for (var w in weights) {
w = weights[w];
sum += w.weight;
}
var rand = Math.random() * sum;
for (var w in weights) {
w = weights[w];
if (rand < w.weight) {
return w.value;
}
rand -= w.weight;
}
return weights[weights.length - 1].value;
}
测试:
var config = [
{ weight: 25, value: 1 },
{ weight: 25, value: 2 },
{ weight: 50, value: 3 }
];
var test = { 1: 0, 2: 0, 3: 0 }, max = 10000;
for (var i = 1; i < max; i += 1) {
test[weightedRandomNumber(config).toString()] += 1;
}
alert('From ' + max + ' rounds; results: ' + JSON.stringify(test));
它一定是50%还是其他所有东西的两倍?例如randomNum(1,4)4的概率是50%,或者4的概率是40%? – jpriebe 2015-02-12 04:04:00
@jpriebe是的,无论给出的范围如何,高数量的命中率都必须达到50%。 – user6623512 2015-02-12 04:06:06
所以如果我做了'randomNum(1,6)',你希望有50%的几率得到6,而其他的都有10%的机会? – 2015-02-12 05:16:38