我看到多个答案说下面的算法可以很好地生成两个值之间的随机数。我得到了虚假的结果,我有时会得到一个高于上限的值。
Dim random as Integer
random = Int (3 - 0 + 1) * Rnd + 0
Debug.Print random
这应该给0到3之间的值吗?我跑几次时看到0到4 .. ???
答案 0 :(得分:2)
这是VBA的特质之一。
通过编写
,您可以更清楚地看到效果random = Int(4) * Rnd
4 * Rnd
是浮点双类型,当它被分配到random
时,将应用与CInt
相同的舍入约定 1 ;即如果Int(4) * Rnd
为3.5或更大,则结果为4.
修复是写
random = Int(4 * Rnd)
1 惯例“圆半到均匀”通常被称为 Banker's Rounding 。看到 https://en.wikipedia.org/wiki/Rounding#Round_half_to_even
答案 1 :(得分:1)
我认为在将浮点数显式转换为整数时可以预期,但可能没有预料到的是舍入是最接近的偶数:
Dim i As Integer
i = 3.5 ' i = 4
i = "2.5" ' i = 2