所以也许这是多余的,也许这就像问为什么大多数人生来就有 5 个手指,最后的简短答案总是:因为事情就是这样,而且它就是这样工作的,但我讨厌这个答案,该死的我想知道怎么做VBA 中的 Rnd() 函数有效。
Ms 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 参数呢?我不可能是唯一一个看到这个公式的人 那到底是什么?
归根结底,它当然可以满足我的任何伪随机数需求,也许我正在寻找礼物马嘴,但仍然如此!
EDIT
我觉得这个问题可能是基于数学本身。如果你取一个小整数,你会应用什么函数来使该整数适合指定的范围..那么有人可以解释这个公式是如何工作的吗?
这是分步指南:
-
Rnd
给出 0 到
-
6 * Rnd
给出 0 到
-
Int(6 * Rnd)
围绕它down所以你会得到一个 0 到 5 之间的随机值
生成介于下限和上限之间的随机数是很常见的。 Excel确实有一个RANDBETWEEN
函数来做到这一点:
Value = WorksheetFunction.RandBetween(1, 6)
Edit:现在让我们把它放进去Lbound
and Ubound
(假设两者都是整数并且Lbound < Ubound
)
首先,定义:
n = ubound - lbound
接下来我们稍微重写一下MSDN公式:
Int((ubound - lbound + 1) * Rnd + lbound)
== Int((ubound - lbound + 1) * Rnd) + lbound
== Int(((n + 1) * Rnd) + lbound
从#3,我们知道Int(((n + 1) * Rnd)
给出 0 到 n 之间的随机整数.因此,当您将该随机数添加到下限时,您会得到一个介于下限和上限之间的数字;
Int(((n + 1) * Rnd) + lbound
== 0...n + lbound
== lbound...ubound
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)