根据0到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/

它实际上取决于随机(int)函数的来源,你没有在你的问题上显示,但我认为你的问题比c++相关的数学更多,如果实际上随机(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

最新更新