我正在做一个项目,我以一定的概率随机运行操作。
我基本上有四个动作。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所说,这是一个数学问题,而不是代码问题。但他的解决方案是错误的。
要解决这个问题,您可以从>=
中删除等号,但随后您还必须更新值,因此它们将如下所示:
if (randNumber > 59)
if (randNumber >19)
if (randNumber >4)
else