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

问题描述 投票:0回答:5

在Excel中,下面的公式将从均值10和方差1的正态分布生成随机数。有没有办法设置固定种子,以便我始终获得一组固定的随机数?我正在使用 Excel 2010

=NORMINV(RAND(),10,1)
random excel-2010 random-seed
5个回答
43
投票

您可以使用电子表格函数实现自己的随机数生成器。例如,C++11 有一个 Lehmer 随机数生成器,称为

minstd_rand
,它是通过递归获得的

X = X*g (mod m)

其中

g = 48271
m = 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 个随机正态变量:

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


4
投票

您可以使用基于 Rnd() 函数的 VBA UDF()。参见:

VBA 中重复随机变量


3
投票

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

Excel 365 中的一个不太实用的解决方案是创建以下命名的 lambda,它采用数组大小和可选种子,并实现另一个答案中的 minstd_rand 方法。请注意,我丢弃了前 5 个元素,以避免种子数量较小的偏差:

姓名:

minstd_rand_01

公式:

=LAMBDA(n,[seed], LET(
  period, 2 ^ 31 - 1,
  _seed, IF(ISOMITTED(seed),RANDBETWEEN(1, period), seed),
  ra, SCAN(_seed, SEQUENCE(n + 5), LAMBDA(prev,_, MOD(48271 * prev, period))),
  INDEX(ra, SEQUENCE(n,,5))/(period)
))

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 单元格中,但当然可以位于任何其他单元格中。它还允许我设置最小值和最大值。


1
投票

我已经为 Excel 实现了 xorshift32(也适用于 Google Sheets)。 将“输入”替换为“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))   
© www.soinside.com 2019 - 2024. All rights reserved.