为Excel随机数生成器设置种子

26
在Excel中,以下公式将生成具有平均值为10和方差为1正态分布的随机数。是否有一种方法可以设置一个固定的种子,以便我每次都能得到一组相同的随机数?我正在使用Excel 2010。
=NORMINV(RAND(),10,1)

有一些参考资料表明没有这样的方法。http://answers.microsoft.com/en-us/office/forum/office_2003-excel/what-define-the-random-seed-within-excel/49085e19-3a63-4191-92db-27da5428b435 - EngrStudent
你是想获取一个非易失性的随机数集合,还是真的需要控制种子? - John Coleman
5个回答

43

你可以使用电子表格函数来实现自己的随机数生成器。例如,C++11有一个名为minstd_randLehmer随机数生成器,它是通过循环得到的。

X = X*g (mod m)

其中g = 48271m = 2^31-1

A1中输入种子值,在A2中输入公式:

=MOD(48271*A1,2^31-1)

并将其复制到您需要的任何地方。

在单元格B2中输入=A2/(2^31-1),在单元格C2中输入=NORM.INV(B2,10,1),根据需要进行复制。请注意,您始终可以通过替换A1中的种子值来重新生成数据。

=RANDBETWEEN(1,2^31-2)

如果您希望重新启用不稳定的随机性,请执行以下操作。

以下屏幕截图显示以此方式生成的25个随机正常变量:

输入图像描述

从直方图可以看出,分布似乎大致正常。


那么,我应该使用哪个值作为随机数呢?我猜测是B列中的数字吧? - Vylix
那是正确的:如果你想要一个均匀随机分布,选择B列。 - whiskeychief
在选择种子值时是否有条件?例如,如果我选择1到1000之间的种子,则第一个生成的数字远低于m。因此,以这些种子开头的随机序列都以“低”随机值开始。是否有一种方法可以确保对于任何连续种子的选择,每个种子的第一个生成值都在从1到m-2的区间内均匀分布? - ElRudi
@ElRudi 种子可以是范围内的任何数字。如果您从小于1000的数字开始,则从小于1000的数字开始。但是,如果您从例如24012开始,则可能会有人反对起始数字与24000异常接近。同样的基本逻辑。一个数字小于1000并没有什么特别之处。如果它成为问题,您总是可以在种子后丢弃前几个输出。 - John Coleman
两年前的问题,回应时间真是令人印象深刻 :) 我会期望在种子之后第一个数字已经是均匀分布的 - 不管选择什么作为种子。因为我期望输入和输出值之间没有相关性。但我现在明白了,如果两个序列的种子值都很小,那么需要几次迭代才能使一个序列中的数字与另一个序列中的数字“失步”。我想最好的方法是在1到m-1的区间内取均匀间隔的种子。 - ElRudi

4

3

一种实用的解决方案是将样本中的值复制到一个新范围。


2
我并不是在假装这是一个完美的解决方案,但对我来说很有效。它的美妙之处在于,我可以为特定的单元格分配一个随机数。
Public Function GetRandom(seed As Double, min As Double, max As Double) As Double
    Dim colrow As Double
    Dim range As Double

    range = max - min
    If (Application.Caller.Column() = Application.Caller.Row()) Then
        colrow = (Log(Application.Caller.Column() + 1) * Log(Application.Caller.Row() + 1)) * seed
    Else
        colrow = (Log(Application.Caller.Column() + 1) / Log(Application.Caller.Row() + 1)) * seed
    End If
    Rnd (-1)
    Randomize colrow 
    test = Rnd * range - range / 2
    GetRandom = colrow 
End Function

使用方法:

=GetRandom($Z$1,1,-1)

在我的示例中,种子值位于Z1单元格中,但它当然可以位于任何其他单元格中。这还允许我设置最小值和最大值。

enter image description here


0
我已经在Excel中实现了xorshift32算法(也适用于Google Sheets)。 将"input"替换为"A1"或其他内容。
=LET(LX, LAMBDA(X, A, BITXOR(X, BITLSHIFT(BITAND(X, 2^(32-A)-1), A))), RX, LAMBDA(X, A, BITXOR(X, BITRSHIFT(X, A))), LX(RX(LX(input, 13), 17), 5))   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接