javascript - 百分比分布 - JavaScript Math.random()

标签 javascript math random

我有10%20%70%的百分比来决定采取哪种行动。我有两种方法来决定:#1 每次都让一个新的 Math.random() 决定,或者 #2 保留一个 Math.random() 结果。查看我在控制台中运行的代码(注意 rand1rand2 方法):

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/

相关文章:

javascript - 嵌套的 JavaScript 回调函数

math - float 学坏了吗?

python - 我可以创建本地 numpy 随机种子吗?

c# - 生成多个随机数

java - 从集合 {1, 3, 100} 中生成随机数

javascript - Angular - 带参数的方法的 Jest 单元测试

javascript - Math.random()*50 + Math.random()*20 的分布与 Math.random()*70 相比如何?

javascript - 如何动态创建和传递对象

math - 当 r < 0 时,(n - (~r % n) - 1) 和 (n - (abs(r) % n)) 之间有区别吗?

java - 更新分位数而不是重新计算