我有10%、20%和70%的百分比来决定采取哪种行动。我有两种方法来决定:#1 每次都让一个新的 Math.random() 决定,或者 #2 保留一个 Math.random() 结果。查看我在控制台中运行的代码(注意 rand1
和 rand2
方法):
console.log('chart1');
var chart1;
var rand1 = function() {
if (Math.random() <= 0.1) chart1[0]++;
else if (Math.random() <= 0.2) chart1[1]++;
else chart1[2]++;
};
var runs = 10000;
for (var j = 0; j < 10; j++) {
chart1 = [0,0,0];
for (var i = 0; i < runs; i++) rand1();
var log = [];
for (var k = 0; k < chart1.length; k++) {
log[k] = Math.round(chart1[k] / runs * 100);
}
console.log(log);
}
console.log('chart2');
var chart2;
var rand2 = function() {
var rand = Math.random();
if (rand <= 0.1) chart2[0]++;
else if (rand >= 0.1 && rand <= 0.3) chart2[1]++;
else chart2[2]++;
};
var runs = 10000;
for (var j = 0; j < 10; j++) {
chart2 = [0,0,0];
for (var i = 0; i < runs; i++) rand2();
var log = [];
for (var k = 0; k < chart2.length; k++) {
log[k] = Math.round(chart2[k] / runs * 100);
}
console.log(log);
}
它产生
chart1
[10, 18, 72]
[10, 17, 72]
[11, 17, 72]
[10, 18, 72]
[10, 18, 72]
[10, 18, 72]
[10, 17, 73]
[10, 18, 72]
[10, 18, 72]
[10, 18, 71]
chart2
[9, 20, 71]
[10, 21, 70]
[10, 19, 71]
[10, 20, 70]
[10, 19, 71]
[10, 20, 70]
[10, 20, 70]
[9, 20, 71]
[10, 20, 71]
[9, 20, 71]
我不明白为什么 chart1
倾向于 ..18, 72]
?
最佳答案
那是因为数学错误。如果您想在第二次比较中使用新的随机数,那么对于 20/90 的情况应该是这样,而不是 20/100。所以:
var rand1 = function() {
if (Math.random() < 0.1) chart1[0]++;
else if (Math.random() < 0.222222222222222) chart1[1]++;
else chart1[2]++;
};
如果您不使用新的随机数,它就会起作用,因为当您遇到第二个条件时,您知道该数字在 0.1 .. 1.0 范围内,因此如果它小于 0.3,则为 20/90案件。如果您选择一个新的随机数,则该数字的范围为 0.0 .. 1.0。
关于javascript - 百分比分布 - JavaScript Math.random(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15837684/