2016-12-14 160 views
1

我知道我可以使用隨機數發生器

var rolls = []; 
for (var i=0; i<100; i++) { 
    rolls.push(Math.floor(6 * Math.random()) + 1); 
} 

得到100個輥具有單個管芯。

但是,如果它是一個神奇的死亡,每個數字都不會顯示出同樣的結果呢?

因此,不是每個數字顯示1/6的時間,數字1-4每個顯示10%的時間,而5顯示20%的時間,其餘的6顯示100%-20 %-4 * 10%= 40%的時間。

你如何使這樣一個隨機數發生器的分佈可以很容易地進行調整?

回答

1

你可以使用與概率的數組,並檢查和計入隨機值。

該函數首先將返回值設置爲最後一個可能的索引並迭代,直到隨機值的其餘部分小於實際概率。

概率必須總和爲1。

function getRandomIndexByProbability(probabilities) { 
 
    var r = Math.random(), 
 
     index = probabilities.length - 1; 
 

 
    probabilities.some(function (probability, i) { 
 
     if (r < probability) { 
 
      index = i; 
 
      return true; 
 
     } 
 
     r -= probability; 
 
    }); 
 
    return index; 
 
} 
 

 
var i, 
 
    probabilities = [0.1, 0.1, 0.1, 0.1, 0.2, 0.4], 
 
    count = {}, 
 
    index; 
 

 
probabilities.forEach(function (_, i) { count[i + 1] = 0; }); 
 

 
for (i = 0; i < 1e6; i++) { 
 
    index = getRandomIndexByProbability(probabilities); 
 
    count[index + 1]++; 
 
} 
 

 
console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

您可以創建所需的分佈如集合

var distribution = [1,1,1,2,2,3]; 
var randomItem = new Random().Next(distribution.Length); 
if(randomItem == 1) 
{ 
    //do something with with probability 50% 
} 
else if (randomItem == 2) 
{ 
    //do something with with probability 33% 
} 
else if (randomItem == 3) 
{ 
    //do something with with probability 17% 
} 

現在你可以添加代碼,應該爲每個案件執行