2013-04-05 141 views
0

我有百分比10%20%70%決定採取何種行動。我有兩種方法來決定:#1讓一個新的Math.random()每次決定,或者#2保留一個Math.random()結果。見我在控制檯中運行的代碼(注意rand1rand2方法):百分比分配 - 的JavaScript的Math.random()

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]

回答

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。

+0

媽的這會給正確的輸出,你是對的。其實它很簡單。如果我總結18和72我得到90.而在90 - 18至72是20%至80%的比例。九十零分之十八= 0.2 = 20%。得到它了。謝謝 – spaxxUnited 2013-04-05 15:55:31

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%的總概率,這是你想要的。

+0

是的。基本的數學。對我感到羞恥!謝謝 – spaxxUnited 2013-04-05 15:57:55

-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]++; 
}; 

現在按你們的要求

+2

是的,這就是OP在第二張圖表中做的事情,問題是爲什麼會有差異。 – Guffa 2013-04-05 15:46:38