好的,所以我要说我存储了一些这样的数据,
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]!
这可能吗?如果是这样,我怎么做?
亲切的问候!
答案 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;
修改强>
如果您想控制即使有变异机会,也可以这样做:
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;
答案 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
用于提取适当随机项的谓词。