繁体   English   中英

加权随机数选择

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM