[英]Weighted Random number selection
我正在開發一個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()
來返回獲勝玩家索引的方法,但是我function selectRandomWinner()
,所有幫助將不勝感激。 謝謝!
計算一個從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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.