如何从Javascript中具有非均匀分布的池中选择随机项?

时间:2017-05-06 09:42:22

标签: javascript arrays algorithm distribution

我有一个数组,让我们说:

var people = [
    {name: "Jack", weight: 10},
    {name: "Beth",weight: 2},
    {name: "Michael",weight: 5},
    {name: "Elsa",weight: 6},
    {name: "April",weight: 3},
    {name: "John",weight: 6},
    {name: "David",weight: 1}
]

我想从这个物品清单中挑选,同时根据体重更频繁地挑选一些物品。

我可以通过将每个物体推入一个单独的数组,与其重量值一样多次,以蛮力来做到这一点。

例如:var newArr = ["Jack", "Jack", "Jack", ........, "John", "John", "David"];

但这不是优雅和最佳的做事方式。给定大量对象,此解决方案不能提供良好的性能。

我想创建一个从数组中选择的函数,并运行该函数100次,甚至1000次以检查解决方案是否返回所需的分布。

function selectVolunteer(arr) {
    // some code here
    return randomVolunteer;
}
// Now run the function 1000 times to check this works
for (var i = 0; i < 10000; i++) {
    function selectVolunteer(people)
}

那么,我有什么选择来创建一个更有效的算法,这样当我遍历100000个对象的列表时就不会有问题。

  

发布此内容时,我查看了StackOverflow建议的一些问题,但找不到我要找的内容。 @trincot提出了一个答案Generate A Weighted Random Number,但与我提出的问题存在一些冲突。如果我使用这些参数arr = {0:0.1, 1:0.7, 2:0.9} 10000次运行建议的函数,它会给我输出:0 : 983 , 1 : 7011 and 2 : 2006这是错误的,因为2的概率大于1,而outout表示不同的东西。

谢谢。

0 个答案:

没有答案