0

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

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]

4

3 回答 3

2

那是因为数学是错误的。如果你想在第二次比较中使用一个新的随机数,那么它应该适用于 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 范围内。

于 2013-04-05T15:34:40.423 回答
1

考虑在第一个图表的第二列中生成数字的概率。首先生成一个出现在第一列的概率为 10% 的数字。如果这个数字没有放在第一列,其中有 90% 的机会,那么它有 20% 的概率出现在第二列。您将一个数字放在第二张图表中的总概率为 0.9 * 0.2 = 0.18。添加一些随机变化,你会得到大约 18 的结果。

对于第三列,您有 100 - 10 - 18 = 72。

如果接受第二个值的概率更改为 2/9 而不是 2/10,我们的总接受概率将是 9/10 * 2/9 = 2/10,即 20%,这就是您想要的.

于 2013-04-05T15:43:39.430 回答
-1

好吧..你为什么在 if 条件下再次调用 Math.random() .???? 像这样使用。

var rand1 = function(){
var number = Math.random();
if(number <= 0.1) chart1[0]++;
else if(number <= 0.3) chart1[1]++;
else chart1[2]++;
};

现在这将根据您的需要提供正确的输出

于 2013-04-05T15:45:29.437 回答