随机数生成器具有不相等的数字分布

时间:2016-12-14 09:40:11

标签: javascript random dice

我知道我可以使用

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

用单个模具获得100卷。

但如果它是一个神奇的死亡,每个数字都不会同样出现呢?

因此,不是每个数字出现1/6的时间,数字1-4每个显示10%的时间,而5显示20%的时间,其余6显示100%-20% -4 * 10%= 40%的时间。

如何制作这样一个可以轻松调整分布的随机数生成器?

2 个答案:

答案 0 :(得分:1)

您可以使用具有概率的数组,并检查并计算随机值。

此函数首先将返回值设置为最后一个可能的索引并迭代,直到随机值的其余部分小于实际概率。

概率必须加到一。

&#13;
&#13;
function getRandomIndexByProbability(probabilities) {
    var r = Math.random(),
        index = probabilities.length - 1;

    probabilities.some(function (probability, i) {
        if (r < probability) {
            index = i;
            return true;
        }
        r -= probability;
    });
    return index;
}

var i,
    probabilities = [0.1, 0.1, 0.1, 0.1, 0.2, 0.4],
    count = {},
    index;

probabilities.forEach(function (_, i) { count[i + 1] = 0; });

for (i = 0; i < 1e6; i++) {
    index = getRandomIndexByProbability(probabilities);
    count[index + 1]++;
}

console.log(count);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以创建具有所需分布的集合,例如

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%
}

现在您可以添加应为每个案例执行的代码