Ale*_*tro 0 javascript arrays sorting random percentage
我有这个:
var users = [user1, user2, user3];
var chances = [20, 20, 60];
var total = 100;
var random = Math.floor((Math.random() * total) + 1);
if (random > 40 && random < 100) {
console.log('winner:', users[2]);
}
if (random > 20 && random < 40) {
console.log('winner:', users[1]);
}
if (random > 0 && random < 20) {
console.log('winner:', users[0]);
}
Run Code Online (Sandbox Code Playgroud)
这将为每个用户提供公平的获胜机会。(60 有 60% 的机会,20 有 20% 的机会)。
但我真正需要的是,这是每个(或任何其他)函数的动态。
我的想法的例子:
chances.forEach(function(entry) {
if (unknownValue > unkownValue2 && unknownValue3 < unknownValue4) {
console.log('winner:', unknownUser);
};
});
Run Code Online (Sandbox Code Playgroud)
所以基本上,如果机会数组的值是 50、100 和 20,那么 100 获胜的机会必须比 50 高 2 倍,比 20 高 5 倍。
我对每个答案都很满意,请不要将其标记为老虎机百分比的重复,这不是我需要的。
作为概率解决方案的替代方案,您还可以创建一个包含重复用户的数组,以便他们的计数对应于相关的百分比。然后要求您的百分比是正整数,而不是分数。
像这样:
const users = [
{name: "Jim", pct: 20},
{name: "Helen", pct: 20},
{name: "Anna", pct: 60}
];
const expanded = users.flatMap(user => Array(user.pct).fill(user));
const winner = expanded[Math.floor(Math.random() * expanded.length)];
console.log("winner: " + winner.name);Run Code Online (Sandbox Code Playgroud)
数字不一定是百分比。如果您需要更高的精度,只需使用更大的数字,可能加起来为 1000 或 10000。