Javascript 非等分布随机数发生器

Javascript 非等分布随机数发生器,javascript,random,dice,Javascript,Random,Dice,我知道我可以用 var rolls = []; for (var i=0; i<100; i++) { rolls.push(Math.floor(6 * Math.random()) + 1); } var rolls=[]; 对于(var i=0;i,您可以创建具有所需分布的集合,例如 var distribution = [1,1,1,2,2,3]; var randomItem = new Random().Next(distribution.Length); if(rand

我知道我可以用

var rolls = [];
for (var i=0; i<100; i++) {
  rolls.push(Math.floor(6 * Math.random()) + 1);
}
var rolls=[];

对于(var i=0;i,您可以创建具有所需分布的集合,例如

var distribution = [1,1,1,2,2,3];
var randomItem = new Random().Next(distribution.Length);
if(randomItem == 1) 
{ 
   //do something with with probability 50%
}
else if (randomItem == 2)
{
   //do something with with probability 33%
}
else if (randomItem == 3)
{
   //do something with with probability 17%
}

现在,您可以添加应针对每种情况执行的代码,您可以使用具有概率的数组,并根据随机值进行检查和计数

该函数首先将返回值设置为最后一个可能的索引,并进行迭代,直到剩余的随机值小于实际概率

概率之和必须为1

函数getRandomIndexByProbability(概率){
var r=Math.random(),
指数=概率。长度-1;
概率。一些函数(概率,i){
if(r<概率){
指数=i;
返回true;
}
r-=概率;
});
收益指数;
}
var i,
概率=[0.1,0.1,0.1,0.1,0.2,0.4],
计数={},
指数
forEach(函数(u,i){count[i+1]=0;});
对于(i=0;i<1e6;i++){
索引=getRandomIndexByProbability(概率);
计数[索引+1]+;
}
console.log(计数);
。作为控制台包装{最大高度:100%!重要;顶部:0;}