VBA – 两个值之间的随机数

我见过多个答案,说下面的algorithm可以很好地生成两个值之间的随机数。 我得到了虚假的结果,我有时会得到一个高于上限的值。

Dim random as Integer random = Int (3 - 0 + 1) * Rnd + 0 Debug.Print random 

这应该给0至3之间的值是正确的? 运行几次时,我看到0到4 ..

在这里输入图像说明

这是VBA的特质之一。

你可以通过写作更清楚地看到效果

 random = Int(4) * Rnd 

4 * Rnd是一个浮点 4 * Rnd型,当它被赋值为random ,应用与CInt相同的舍入约定1 ; 即如果Int(4) * Rnd是3.5或更大,结果是4。

解决的办法是写

 random = Int(4 * Rnd) 

1 “半到平”的惯例通常被称为银行家舍入 。 请参阅https://en.wikipedia.org/wiki/Rounding#Round_half_to_even

我认为当将浮点数明确地转换为整数时是可以预料的,但是可能不能预期的是舍入是朝向最接近的偶数:

 Dim i As Integer i = 3.5 ' i = 4 i = "2.5" ' i = 2