假设我有一个数组
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']
并只是随机选择一个值,但我正在寻找一种更有效的方法,只需要一个包含偏差的数组。
答案 0 :(得分:5)
制作累积偏见列表:
var sum = 0;
var cumulativeBias = bias.map(function(x) { sum += x; return sum; });
然后从0
到sum
(即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)];
如果需要,可以通过编程方式构建选择数组。它只需要构建一次,从那时起随机选择的选择将明显加快这种方法。