数组中的随机赔率

时间:2017-03-23 13:36:55

标签: javascript arrays random

好的,所以我要说我存储了一些这样的数据,

var thisList = {
    "items":[
        {"name":"Item1", "image":"/img/item1", "chance":0.25},
        {"name":"Item2", "image":"/img/item2", "chance":0.25},
        {"name":"Item3", "image":"/img/item3", "chance":0.50}
    ]           
}

现在我想创建一个随机选择此列表中的项目的函数,其中获得[0]的可能性为25%,获得[1]的可能性为25%,获得[0]的可能性为50% [2]!

这可能吗?如果是这样,我怎么做?

亲切的问候!

2 个答案:

答案 0 :(得分:3)

你实际上可以像这样玩,tou生成0到100之间的数字然后你循环每个元素并总结检查它是否在值之间的机会:



var thisList = {
    "items":[
        {"name":"Item1", "image":"/img/item1", "chance":0.25},
        {"name":"Item2", "image":"/img/item2", "chance":0.25},
        {"name":"Item3", "image":"/img/item3", "chance":0.50}
    ]           
};

function getRandom(){
  var rnd = Math.floor(Math.random() * 100);
  console.log("The number is: " + rnd);
  var counter = 0;
  for(i=0;i<thisList.items.length;i++)
  {
    counter += thisList.items[i].chance * 100;
    if(counter > rnd){
      console.log(thisList.items[i]);
      break;
    }
  }
}

getRandom();
&#13;
&#13;
&#13;

修改

如果您想控制即使有变异机会,也可以这样做:

&#13;
&#13;
var thisList = {
    "items":[
        {"name":"Item1", "image":"/img/item1", "chance":0.25},
        {"name":"Item2", "image":"/img/item2", "chance":0.25},
        {"name":"Item3", "image":"/img/item3", "chance":0.50}
    ]           
};

function getRandom(){
  var sum = 0;
  for(i=0;i<thisList.items.length;i++)
  {
    sum += thisList.items[i].chance;
  }
  var rnd = Math.floor(Math.random() * (sum * 100));
  console.log("The number is: " + rnd);
  var counter = 0;
  for(i=0;i<thisList.items.length;i++)
  {
    counter += thisList.items[i].chance * 100;
    if(counter > rnd){
      console.log(thisList.items[i]);
      break;
    }
  }
}

getRandom();
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您需要查看目前在数组中看到的所有赔率的累积总和。对于您给出的样本数据,这些值将为0.25,0.5,1.0

然后给出[0,1]范围内的随机数,只需选择累积值小于该数字的第一个条目。

以下是一个示例实现:

const pickRandom = (() => {
    let target = Math.random(), total = 0.0;
    return (e, i, a) => {
        total += e.chance;
        return target < total;
    }
});

let picked = thisList.items.find(pickRandom());

pickRandom函数需要每轮一次调用,并返回一个函数,该函数封装了累积到目前为止看到的机会所需的状态,以及随机数。使用。

该函数随后成为Array.prototype.find用于提取适当随机项的谓词。