2015-04-23 104 views
0

我正在開發一個應用程序的Node.js其中一個獲獎者必須是隨機選擇基於它在[0,100]%的範圍內取勝概率加權隨機選號

我的代碼如下:

var activeGame = { 
    id: 12324, 
    type: 1, 
    active: true, 
    players: [{ 
     id: 5032, 
     name: "Username", 
     foo: true, 
     winProbability: 56.32 //% 
    }, { 
     id: 98243, 
     name: "Username", 
     foo: true, 
     winProbability: 22.68 //% 
    }, { 
     id: 10943, 
     name: "Username", 
     foo: false, 
     winProbability: 21.00 //% 
    }], 
}; 

我發現其他算法不是非常明確,並且不適用於概率加起來爲100%。

我正在尋找一種方法來創建一個function selectRandomWinner()返回獲獎玩家的索引但我卡住了,所有和任何幫助將不勝感激。謝謝!

+0

生成單個隨機數0..100。將它與第一個玩家的號碼進行比較。減?他贏了。如果更大,則比較第一個和第二個玩家的數字的總和。還是更大?然後添加第三個玩家的號碼....等等。簡而言之,只需將您的選擇與您下注時玩家的總數相加即可。最後一名球員將導致總和爲100,所以當所有其他球員失敗時(以及正確的數額),他將獲勝。 –

回答

4

計算一個隨機數從0到100。然後通過加入玩家它們的概率總共,直到總大於隨機數更高的循環:

var activeGame = { 
 
    id: 12324, 
 
    type: 1, 
 
    active: true, 
 
    players: [{ 
 
    id: 5032, 
 
    name: "Joe", 
 
    foo: true, 
 
    winProbability: 56.32 //% 
 
    }, { 
 
    id: 98243, 
 
    name: "Jane", 
 
    foo: true, 
 
    winProbability: 22.68 //% 
 
    }, { 
 
    id: 10943, 
 
    name: "Fred", 
 
    foo: false, 
 
    winProbability: 21.00 //% 
 
    }], 
 
}; 
 

 
function pickPlayer() { 
 
    var randPct = Math.random() * 100; 
 
    var total = 0; 
 
    var players = activeGame.players; 
 
    var selectedPlayer; 
 
    for (var i = 0; i < players.length; i++) { 
 
    total += players[i].winProbability; 
 
    if (randPct < total) { 
 
     selectedPlayer = players[i]; 
 
     break; 
 
    } 
 
    } 
 
    return selectedPlayer; 
 
} 
 

 
var results = document.getElementById("results"); 
 
var resultObj = {}; 
 
for (var i = 0; i < 1000; i++) { 
 
    var playerName = pickPlayer().name; 
 
    if (resultObj[playerName]) { 
 
    resultObj[playerName] ++; 
 
    } else { 
 
    resultObj[playerName] = 1; 
 
    } 
 
} 
 
for (name in resultObj) { 
 
    results.innerHTML += "<tr><td>" + name + "</td><td>" + resultObj[name] + "</td></tr>"; 
 
}
Results of picking 1000 players: 
 
<table id="results"> 
 
    <tr> 
 
    <th>Name</th> 
 
    <th>Count</th> 
 
</table>