首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从具有加权元素的数组中获取随机元素

从具有加权元素的数组中获取随机元素
EN

Stack Overflow用户
提问于 2017-01-01 20:20:56
回答 2查看 4.5K关注 0票数 0

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

我正在尝试开发一种随机繁殖生物的算法,但是我没有想出一种使用重量的方法(我真的不知道怎么做)。

有人能帮忙吗?

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

代码语言:javascript
复制
var creatures = [
    {id: 1, weight: 25},
    {id: 2, weight: 15},
    {id: 3, weight: 5},
    {id: 4, weight: 45},
    {id: 5, weight: 10}
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-01 20:31:47

我在这个博客中找到了这个用PHP实现的好算法,我认为这个算法非常适合您的需要。

我刚把它收养给JS。

代码语言:javascript
复制
var creatures = [{
    id: 1,
    weight: 25
  }, {
    id: 2,
    weight: 15
  }, {
    id: 3,
    weight: 5
  }, {
    id: 4,
    weight: 45
  }, {
    id: 5,
    weight: 10
  }],
  sumOfWeights = creatures.reduce(function(memo, creature) {
    return memo + creature.weight;
  }, 0),
  selectedWeigths = {};

function getRandom(sumOfWeights) {
  var random = Math.floor(Math.random() * (sumOfWeights + 1));

  return function(creature) {
    random -= creature.weight;
    return random <= 0;
  };
}

for (var i = 0; i < 1000; i++) {
  var creature = creatures.find(getRandom(sumOfWeights));
  selectedWeigths[creature.weight] = (selectedWeigths[creature.weight] || 0) + 1;
}

console.log(selectedWeigths);

希望能帮上忙。

票数 9
EN

Stack Overflow用户

发布于 2017-01-01 20:33:15

创建一个新的数组,并将每个生物的id添加到数组中的加权次数。然后获取0与数组大小之间的随机数,并在该位置返回id数。

代码语言:javascript
复制
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];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41418689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档