我想知道获得基于概率例如小数点后两位的随机数:获取随机数基于概率
40% to get number from 1-10
20% to get number from 11-20
30% to get number from 21-30
10% to get number from 31-35
我想知道获得基于概率例如小数点后两位的随机数:获取随机数基于概率
40% to get number from 1-10
20% to get number from 11-20
30% to get number from 21-30
10% to get number from 31-35
function Prob(){
var rnd = Math.random(),
rnd2 = Math.random();
if(rnd<0.4) return (1 + Math.floor(1000 * rnd2)/100);
else if(rnd<0.6) return (11 + Math.floor(1000 * rnd2)/100);
else if(rnd<0.9) return (21 + Math.floor(1000 * rnd2)/100);
else return (31 + Math.floor(500 * rnd2)/100);
}
你需要两个随机数,所以我在开始计算它们。然后,我使用if-else循环遍历40%,20%,30%和10%(随着我的增加)。注意:Math.random返回一个介于0和1之间的数字。然后,对于每个类别,我使用第二个随机数来获得您所说的范围 - 确定它是一个整数并添加每个范围的起始数字。注意:您的最后一个的范围仅仅是5
我应该解释一下,你必须使用两个随机数,第二个数字,否则的范围将取决于你是哪一类
我有。在场内做1000 * rnd2,然后再除以100得到你要求的2位小数位。
我想这
var get1120 = _ => ~~(Math.random()*10)+11,
get2130 = _ => ~~(Math.random()*10)+21,
get3135 = _ => ~~(Math.random()*5)+31,
a = [get3135,get1120,get1120,get2130,get2130,get2130],
fun;
result = (fun = a[~~(Math.random()*10)]) ? fun() : ~~(Math.random()*10)+1;
console.log(result);
可能做到这一点;
Rewind的解决方案非常棒,专门针对OP的问题量身打造。更可重复使用的解决方案可能是:
function getNumber(probabilities){
var rnd = Math.random();
var total = 0;
var hit;
for(var i = 0; i < probabilities.length; i++){
if(rnd > total && rnd < total + probabilities[i][0]){
hit = probabilities[i]
}
total += probabilities[i][0];
}
return Number((hit[1] + (Math.random() * (hit[2] - hit[1]))).toFixed(2));
}
var number = getNumber(
[
//chance, min, max
[0.4, 1, 10],
[0.2,11,20],
[0.3,21,30],
[0.1,31,35]
]
);
console.log(number);
功能将一个数组的概率,每个概率指定的机会,对于这样的机会的最低值,这样的机会的最大值。它将返回一个有两位小数的数字。
生成一个随机数并使用数字轮。 – Jecoms
您可以使用“加权随机数”作为搜索词。 “概率”通常指的是分布(正态,泊松等) –
您可以研究如何做到这一点,尝试实施它,然后再回来,如果你卡住了。 – vlaz