我知道我可以使用
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%的时间。
如何制作这样一个可以轻松调整分布的随机数生成器?
答案 0 :(得分:1)
您可以使用具有概率的数组,并检查并计算随机值。
此函数首先将返回值设置为最后一个可能的索引并迭代,直到随机值的其余部分小于实际概率。
概率必须加到一。
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;
答案 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%
}
现在您可以添加应为每个案例执行的代码