簡體   English   中英

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

[英]percentage distribution - 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。

考慮在第一個圖表的第二列中生成數字的概率。 首先生成一個以第一列結束的概率為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%的總概率,這就是你想要的。

嗯...你為什么在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]++;
};

現在這將根據需要提供正確的輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM