使用具有偏差的Random()

时间:2015-01-05 23:37:17

标签: javascript random

假设我有一个数组

var list = ['a', 'b', 'c', 'd'];

我希望随机选择List中的一个值。如果它是完全随机的,每个人有25%的几率。有没有办法随机选择一个像这样的偏差值:

var bias = [0.1, 0.2, 0.1, 0.6];

(偏差当然加起来为1)

所以' a'有10%的几率被选中并且' b'有20%的机会被选中等等

编辑:我知道我可以修改do var list = ['a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd', 'd']并只是随机选择一个值,但我正在寻找一种更有效的方法,只需要一个包含偏差的数组。

3 个答案:

答案 0 :(得分:5)

制作累积偏见列表:

var sum = 0;
var cumulativeBias = bias.map(function(x) { sum += x; return sum; });

然后从0sum(即cumulativeBias[cumulativeBias.length - 1])创建一个随机数:

var choice = Math.random() * sum;

然后在cumulativeBias中搜索大于choice的第一个元素。您可以使用二进制搜索来获得速度,但对于简短列表,顺序搜索就足够了。该元素的索引是所选索引。例如,像:

var chosenIndex = null;
cumulativeBias.some(function(el, i) {
    return el > choice ? ((chosenIndex = i), true) : false;
});
chosenElement = list[chosenIndex];

答案 1 :(得分:4)

我过去用以下方式写过:

用运行总计替换偏差 - 即将偏差[0]加到偏差[1],然后将偏差[1]加到偏差[2],然后将偏差[2]加到偏差[3]。

在上面的示例中,您将得到var bias = [0.1, 0.3, 0.4, 1.0] - 最后一个应该始终为1,否则您做错了。

现在选择0到1.0之间的随机数;找到偏差数组中的最大数字,即小于随机数。从列表数组中选择相应的值。

编辑:@Amadan是对的。我的意思是,找到偏置数组中最小的数字,大于你的随机数。我最小的"和#34;最大"是错误的方式:)

答案 2 :(得分:0)

由于你的偏见很简单,你可以制作一个提供10%'a',20%'b'的数组等等,然后从中选择一个随机值:

var choices = ['a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd', 'd'];
var biasVal = choices[Math.floor(Math.random() * choices.length)];

如果需要,可以通过编程方式构建选择数组。它只需要构建一次,从那时起随机选择的选择将明显加快这种方法。