[Nodejs] Weighted Random,帶有權重的隨機函式

前一陣子寫論文時,有用到一些輪盤法,用圖片簡言之

輪盤法

比如我們希望依照上方的圓餅圖的比例去選出A、B及C等項目。

  • 選到A的機率為 20%
  • 選到B的機率為 15%
  • 選到C的機率為 10%
  • 選到其他的機率為 55%

以下的程式碼為使用 Nodejs 實作這樣的帶有權重的隨飢函式

var items=["A", "B", "C", "other"];
var itemsWeight=[20, 15, 10, 55];
function weightedRandom(items, itemsWeight)
{
    var totalWeight=eval(itemsWeight.join("+"));
    console.log(totalWeight);
    // 100
    var randomArray=[];
    for(var i=0; i<items.length; i++)
    {
        for(var j=0; j<itemsWeight[i]; j++)
        {
            randomArray.push(i);
        }
    }
    var randomNumber=Math.floor(Math.random()*totalWeight);
    return items[randomArray[randomNumber]];
}
weightedRandom(items, itemsWeight);
// 這樣就會依照原餅圖機率隨機選出囉!

PS. 如果不想重複選的話,就需要有一個陣列記住哪些選過了~

參考資料:

http://www.blogjava.net/sevenduan/archive/2009/12/11/305552.html

 

 

 

 

Leave a Reply