带百分比的随机数

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 倍。

我对每个答案都很满意,请不要将其标记为老虎机百分比的重复,这不是我需要的。

tri*_*cot 8

作为概率解决方案的替代方案,您还可以创建一个包含重复用户的数组,以便他们的计数对应于相关的百分比。然后要求您的百分比是正整数,而不是分数。

像这样:

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。