62

我想写一个程序:

  • 80%的时间会说sendMessage("hi");
  • 5%的时间会说sendMessage("bye");
  • 15% 的时间会说sendMessage("Test");

它与 有什么关系Math.random()吗?像

if (Math.random() * 100 < 80) {
  sendMessage("hi");
}
else if (Math.random() * 100 < 5) {
  sendMessage("bye");
}
4

7 回答 7

73

是的,Math.random()这是实现这一目标的绝佳方式。你想要做的是计算一个随机数,然后根据它做出决定:

var d = Math.random();
if (d < 0.5)
    // 50% chance of being here
else if (d < 0.7)
    // 20% chance of being here
else
    // 30% chance of being here

这样你就不会错过任何可能性。

于 2012-07-19T00:10:10.827 回答
21

对于这样的情况,通常最好生成一个随机数并根据该单个数字选择情况,如下所示:

int foo = Math.random() * 100;
if (foo < 80) // 0-79
    sendMessage("hi");
else if (foo < 85) // 80-84
    sendMessage("bye");
else // 85-99
    sendMessage("test");
于 2012-07-19T00:09:36.237 回答
4

我通过创建一个池并使用 Fisher yates shuffle 算法来获得一个完全随机的机会,从而创建了一个百分比机会函数。下面的代码片段测试了 20 次机会随机性。

var arrayShuffle = function(array) {
   for ( var i = 0, length = array.length, swap = 0, temp = ''; i < length; i++ ) {
      swap        = Math.floor(Math.random() * (i + 1));
      temp        = array[swap];
      array[swap] = array[i];
      array[i]    = temp;
   }
   return array;
};

var percentageChance = function(values, chances) {
   for ( var i = 0, pool = []; i < chances.length; i++ ) {
      for ( var i2 = 0; i2 < chances[i]; i2++ ) {
         pool.push(i);
      }
   }
   return values[arrayShuffle(pool)['0']];
};

for ( var i = 0; i < 20; i++ ) {
   console.log(percentageChance(['hi', 'test', 'bye'], [80, 15, 5]));
}

于 2018-12-07T15:49:27.260 回答
1

我一直用我的不和谐机器人这样做

const a = Math.floor(Math.random() * 11);
    if (a >= 8) { // 20% chance
        /*
          CODE HERE
        */
    } else { // 80% chance
        /*
          CODE HERE
        */
    }

如果需要,您可以将 11 更改为 101。

它有一个额外的原因是它做 1 - 10 而不是 1 - 9 (或 1 - 100 而不是 1 - 99)

于 2021-05-28T10:23:40.290 回答
0

产生 20% 的几率获得“Yupiii!” 在 console.log 中

const testMyChance = () => {

  const chance = [1, 0, 0, 0, 0].sort(() => Math.random() - 0.5)[0]

  if(chance) console.log("Yupiii!")
  else console.log("Oh my Duck!")
}

testMyChance()
于 2020-07-22T01:25:50.990 回答
-1

爪哇

/**
 * Zero or less returns 'false', 100 or greater returns 'true'. Else return probability with required percentage.
 * @param percentage for example 100%, 50%, 0%.
 * @return true or false with required probability.
 */
private static boolean probably(int percentage) {
    double zeroToOne = Math.random(); // greater than or equal to 0.0 and less than 1.0
    double multiple = zeroToOne * 100; // greater than or equal to 0.0 and less than 100.0
    return multiple < percentage;
}

JavaScript

function probably(percentage) {
  return Math.random() * 100 < percentage;
}
于 2021-02-27T09:49:55.677 回答
-3

这是该问题的一个非常简单的近似解决方案。随机对一组真/假值进行排序,然后选择第一项。

这应该有三分之一的机会是真实的..

var a = [true, false, false]
a.sort(function(){ return Math.random() >= 0.5 ? 1 : -1 })[0]
于 2017-11-27T01:08:15.697 回答