我正在做一個專案,我以一定的概率隨機運行動作。
我基本上有四個動作。Action A有40%Action B的概率,有40%Action C的概率,有15%Action D的概率,有5%的概率。
我的方法是生成一個介于 0 到 99 之間的亂數 (int)(100 個可能的整數值)。然后相應地運行操作,但這些數字對我來說并沒有加起來。
代碼基本上是:
// 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% 的最后一個概率并沒有加起來。
random() 來源:https ://www.arduino.cc/reference/en/language/functions/random-numbers/random/
uj5u.com熱心網友回復:
它實際上取決于 random(int) 函式的來源,你沒有在你的問題上顯示,但我認為你的問題比 C 更與數學相關,如果實際上 random(int) 在 0 和 99 之間是統一的。
>=59 有多少?我很確定有 41 個,而不是 40 個,因此您給出的概率等于 41%,而不是 40%(對于 99 - 59 1 >=)。而且18<= x < 59完全一樣,實際上有41個。
歸根結底,您沒有數字,因為每個間隔都太多了 1。
嘗試從中洗掉相等>=并相應地重新考慮您的間隔,(59、19等)
uj5u.com熱心網友回復:
正如 chiappar 所說,這是一個數學問題,而不是代碼問題。但他的解決方案是錯誤的。
要解決此問題,您可以從 中洗掉等號>=,但您還必須更新值,因此它們將如下所示:
if (randNumber > 59)if (randNumber >19)if (randNumber >4)else
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/486298.html
上一篇:如何撰寫具有行內冪計算的列舉?
下一篇:Dart將元素組合在一個數字中
