在Excel中,以下公式将生成具有平均值为10和方差为1正态分布的随机数。是否有一种方法可以设置一个固定的种子,以便我每次都能得到一组相同的随机数?我正在使用Excel 2010。
=NORMINV(RAND(),10,1)
=NORMINV(RAND(),10,1)
你可以使用电子表格函数来实现自己的随机数生成器。例如,C++11有一个名为minstd_rand
的Lehmer随机数生成器,它是通过循环得到的。
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个随机正常变量:
从直方图可以看出,分布似乎大致正常。
m
。因此,以这些种子开头的随机序列都以“低”随机值开始。是否有一种方法可以确保对于任何连续种子的选择,每个种子的第一个生成值都在从1到m-2的区间内均匀分布? - ElRudi一种实用的解决方案是将样本中的值复制到一个新范围。
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)
=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))