加权随机数选择
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()
到 return 获胜玩家的索引 但我被困住了任何帮助将不胜感激。谢谢!
计算一个从 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>
我正在开发一个 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()
到 return 获胜玩家的索引 但我被困住了任何帮助将不胜感激。谢谢!
计算一个从 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>