Excel VBA了解随机语句

时间:2019-01-08 08:32:13

标签: excel vba

我正在研究一个小程序,该程序会生成标准的,正态分布的数字,并提供均匀分布的随机数的来源。因此,我需要生成一堆随机数。我决定使用 RND功能,因为该程序应尽可能快(因此,我不想使用额外的种子功能)。

做一些研究,我发现RND-Function使用之前的Randomize语句可以更有效地工作。我不了解可选数字参数的描述。我知道如果不给Randomize函数任何参数,它将使用系统计时器值作为新的种子值。

有人可以向我解释该功能实际上在做什么可选号码吗?使用Randomize(1)Randomize(99)甚至使用Randomize("blabla")有什么区别吗?我想了解此可选输入数字背后的理论。谢谢!

enter image description here

2 个答案:

答案 0 :(得分:2)

引用关于CrossValidated的一个非常相似的问题

  

大多数pseudo-random number generators (PRNGs)都是基于涉及某种递归方法的算法构建的,该算法从称为“种子”的输入确定的基值开始。大多数统计软件(R,Python,Stata等)中的默认PRNG是Mersenne Twister algorithm MT19937,它在Matsumoto and Nishimura (1998)中列出。这是一个复杂的算法,因此,如果您想详细了解它的工作原理,则最好阅读该论文。在此特定算法中,存在度为$ n $的递归关系,并且您的输入种子是向量的初始集合 x0,x1,...,xn-1 。该算法使用线性递归关系生成:

xn+k = f(xk, xk+1, xk+m, r, A)
     

其中 1 <= m <= n r A 是可以在算法中指定为参数的对象。由于种子给出了向量的初始集合(以及算法的其他固定参数),因此算法生成的一系列伪随机数是固定的。如果更改种子,则将更改初始向量,这将更改算法生成的伪随机数。当然,这就是种子的功能。

     

现在,重要的是要注意,这只是使用MT19937算法的一个示例。统计软件中可以使用许多PRNG,并且每种PRNG都涉及不同的递归方法,因此种子在每种中都意味着不同的东西(从技术上来说)。您可以在this documentation中找到R的PRNG库,其中列出了可用的算法以及描述这些算法的论文。

     

种子的目的是允许用户“锁定”伪随机数生成器,以进行可复制的分析。一些分析师喜欢使用true random-number generator (TRNG)设置种子,该种子使用硬件输入来生成初始种子编号,然后将其报告为锁定编号。如果种子是由原始用户设置和报告的,则审核员可以重复分析并获得与原始用户相同的伪随机数序列。如果未设置种子,则该算法通常会使用某种默认种子(例如,从系统时钟中获取),并且通常将无法复制随机化。

正如您对问题的引用所示,VBA randomize函数将为RND函数设置一个新的种子,或者使用系统时间作为种子,或者如果您为该函数提供参数,它将使用该数字作为RND的新种子。如果在调用RND函数之前未调用Randomize函数,则RND函数会将RND中的先前数字用作新种子,因此您可能会继续获得相同的数字序列。

我还建议您看看this answer

答案 1 :(得分:2)

种子用于初始化伪随机数生成器。基本上,种子是用于生成伪随机数的,您可以将其视为生成随机数的起点。如果种子在变化,则数字的随机性会增加,这就是为什么默认使用是使用当前系统时间(因为它不断变化)的原因。

您发表的有关MSDN文章的评论:

  

Randomize使用 number 初始化Rnd函数的随机数生成器,为其提供一个新的种子值。如果省略 number ,则系统计时器返回的值将用作新的种子值。

因此,如果您指定参数,则将始终具有相同的种子,从而降低了随机性。

  

如果不使用Randomize,则Rnd函数(不带参数)将在首次调用时使用与种子相同的数字,然后将最后生成的数字用作种子值。

这里我们使用生成的最后一个随机数作为种子,这会增加随机性。