use*_*942 3 random excel vba excel-vba
所以也许这是多余的,也许就像问为什么大多数人天生就有5个手指,最后简短的回答总是:因为它就是这样,它只是起作用,但我讨厌这个答案并且该死我想知道如何VBA中的Rnd()函数有效.
Office Office Excel的MSDN表示RND定义为:
Rnd[(number)] 'The optional number argument is a Single or any valid numeric expression.
它继续说
"number的值确定Rnd如何生成随机数:对于任何给定的初始种子,生成相同的数字序列,因为对Rnd函数的每次连续调用都使用前一个数字作为序列中下一个数字的种子."
接下来是这样的:
要在给定范围内生成随机整数,请使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
例如:
Dim MyValue
MyValue = Int((6 * Rnd) + 1) ' Generate random value between 1 and 6.
但是这有什么作用呢?这些数字来自哪里?为什么会6 * Rnd + 1得到1到6之间的随机数,但6 * Rnd + 5会得到5到10之间的数字?
此外,如果VBA的创建者使用什么公式来成功地将其缩小到特定范围,那么为什么不让RND函数带有可选的Ubound和Lbound参数呢?我不可能是唯一一个关注那个公式的人,那个世界是什么?
在一天结束时,它对我的任何伪随机数需求当然都很好,也许我正在寻找一个礼物马,但仍然!
编辑
在我看来,这个问题可能基于数学本身.如果你取一个小整数,你应用什么函数来使整数适合指定范围..所以任何人都可以解释这个公式是如何工作的?
这是一步一步的指南:
Rnd 给出0到<1之间的随机小数6 * Rnd 给出0到<6之间的随机小数Int(6 * Rnd)将其向下舍入,以便获得0到5之间的随机值在下限和上限之间生成随机数是很常见的.Excel确实有这样的RANDBETWEEN功能:
Value = WorksheetFunction.RandBetween(1, 6)
Run Code Online (Sandbox Code Playgroud)
编辑:现在让我们适应Lbound和Ubound(假设两者都是整数Lbound < Ubound)
首先,定义:
n = ubound - lbound
Run Code Online (Sandbox Code Playgroud)
接下来,我们将略微重写MSDN公式:
Int((ubound - lbound + 1) * Rnd + lbound)
== Int((ubound - lbound + 1) * Rnd) + lbound
== Int(((n + 1) * Rnd) + lbound
Run Code Online (Sandbox Code Playgroud)
从#3开始,我们知道Int(((n + 1) * Rnd)在0和n之间给出一个随机整数.因此,当您将该随机数添加到下限时,您将获得下限和上限之间的数字;
Int(((n + 1) * Rnd) + lbound
== 0...n + lbound
== lbound...ubound
Run Code Online (Sandbox Code Playgroud)