Javascript 使用加权元素从数组中获取随机元素

Javascript 使用加权元素从数组中获取随机元素,javascript,arrays,Javascript,Arrays,我有一系列的物体,它们代表我正在开发的游戏中的生物。这些对象(除其他外)具有唯一的标识符和生成的权重(或概率) 我试图开发一种随机繁殖生物的算法,但我没能想出一种使用权重的方法(我真的不知道怎么做) 有人能帮忙吗 生物阵列的一个示例可以是: var creatures = [ {id: 1, weight: 25}, {id: 2, weight: 15}, {id: 3, weight: 5}, {id: 4, weight: 45}, {id: 5,

我有一系列的物体,它们代表我正在开发的游戏中的生物。这些对象(除其他外)具有唯一的标识符和生成的权重(或概率)

我试图开发一种随机繁殖生物的算法,但我没能想出一种使用权重的方法(我真的不知道怎么做)

有人能帮忙吗

生物阵列的一个示例可以是:

var creatures = [
    {id: 1, weight: 25},
    {id: 2, weight: 15},
    {id: 3, weight: 5},
    {id: 4, weight: 45},
    {id: 5, weight: 10}
]

我发现这是一个很好的用PHP实现的算法,我认为它可能适合您的需要

我刚把它用在JS上

var=[{
id:1,
体重:25
}, {
id:2,
体重:15
}, {
id:3,
体重:5
}, {
id:4,
体重:45
}, {
id:5,
体重:10
}],
重量总和=生物。减少(功能(备忘录,生物){
返回备忘录+生物重量;
}, 0),
所选重量={};
函数getRandom(重量总和){
var random=Math.floor(Math.random()*(sumOfWeights+1));
返回功能(生物){
随机-=生物重量;

return random创建一个新阵列,将每个生物的id添加到该阵列中,并将其加权的次数。然后获取一个介于0和阵列大小之间的随机数,并返回该位置的id号

var creatureIds = [];
for(var i=0;i<creatures.length;i++){
    for(var x=0;x<creatures[i].weight;x++){
        creatureIds.push(creatures[i].id);
    }
}

// get a random index between 0 and the ids length.
var min = 0;
var max = creatureIds.length;
var index = Math.floor(Math.random() * (max - min + 1)) + min;

var randomWeightedCreatureId = creatureIds[index];
var creatureIds=[];

对于(var i=0;i您遵循的逻辑是什么?逻辑是什么意思?我想检索一个生物对象(该对象引用了该生物的构造函数)为了在某些场景中创建它,你想把一个随机生物带出去吗?现在,
weight
如何在这里发挥作用?Praveen的意思是,
weight
属性在选择元素的随机性中扮演什么角色?好的,对不起,我不明白。问题是,一个生物有一定的机会或概率出现。这个机会是权重。因此,权重越大,被选中的机会就越大。你能解释一下这是怎么回事吗?@evolutionxbox该算法基于离散累积密度函数(CDF)这是权重之和。其思想是生成一个介于0和该和之间的随机数,并将数组中元素的权重减去该随机数。当它小于零(或零)时,意味着您已经找到了元素。仅用一段时间来解释有点困难,我建议查找Wikipedia上的“离散累积密度函数”,有一个更好的解释。这个解决方案很有前途。谢谢。我发现这个工厂如何生成一个作用域函数,这个函数仅用于
.find()
方法。很酷的函数!尽管经过一些测试,我相信
Math.random()*(sumOfWeights+1)
应该是
Math.random()*sumOfWeights+1
而不是此解决方案的唯一问题是,当您可能不需要时,您最终会得到一个大数组…但无论如何,谢谢!