根据 0 到 99 之间的随机值以预定义的概率执行不同的操作

Perform different actions with predefined probability based on random value between 0 and 99

我正在做一个项目,我 运行 以一定的概率随机行动。

我基本上有四个动作。 Action A 的概率为 40%,Action B 的概率为 40%,Action C 的概率为 15%,Action D 的概率为 5%。

我的方法是生成一个介于 0 和 99(100 个可能的整数值)之间的随机数 (int)。然后 运行 采取相应的行动,但这些数字对我来说不合算。

代码基本上是:

    // values starting from 0 up to 99
    randNumber=random(100);

    // Probability of 40% (will enter for values including 59 up to 99 (40 numbers))
    if (randNumber >= 59)
    {
      actionA();
    }
    // Probability of 40% (will enter for values including 18 up to 58 (40 numbers))
    else if (randNumber >=18)
    {
      actionB();
    }
    // Probability of 15% (will enter for values including 2 up to 17 (15 numbers))
    else if (randNumber >=2)
    {
      actionC();
    }
    // Remaining probability of what should be 5% (will enter for values including 0 to 1 (2 numbers)) ???
    else
    {
        actionD();
    }

我哪里错了?对于从 0 到 99 的值,我应该有 100 个可能的数字。但是,最后5%的概率加起来不对。

随机源():https://www.arduino.cc/reference/en/language/functions/random-numbers/random/

它实际上取决于 random(int) 函数的来源,你没有在你的问题上显示,但我认为你的问题更多 math-related 比 C++ 相关,如果实际上 random(int) 是包括 0 到 99 之间的统一值。

>=59 有多少?我很确定有 41 个,而不是 40 个,因此您给出的概率等于 41%,而不是 40%(>= 为 99 - 59 + 1)。和18<= x < 59完全一样,居然有41个。

归根结底,你没有数字,因为每个间隔都是 1 太多了。

尝试从 >= 中删除等号并相应地重新考虑您的间隔,(59、19 等等)

正如 chiappar 所提到的,这是一个数学问题,而不是代码问题。 但是他的解决方案是错误的。

要解决此问题,您可以删除 >= 中的等号,但您还必须更新值,因此它们将如下所示:

  1. if (randNumber > 59)
  2. if (randNumber >19)
  3. if (randNumber >4)
  4. else