为 Excel 随机数生成器设置种子
Setting seed for Excel random number generator
在下面的 excel 中,公式将从均值为 10 方差为 1 的正态分布生成随机数。有没有办法设置固定种子,以便我始终获得一组固定的随机数?我正在使用 Excel 2010
=NORMINV(RAND(),10,1)
您可以使用基于 Rnd() 函数的 VBA UDF()。参见:
Repeating random variables in VBA
您可以使用电子表格函数实现您自己的随机数生成器。例如C++11有一个叫做minstd_rand
的Lehmer random number generator,它是通过递归
得到的
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 个随机正态变量:
从直方图中可以看出,分布似乎大致正常。
我并不是在假装这是一个完美的解决方案,但它对我有用。
它的美妙之处在于我可以为特定的单元格分配一个随机数:
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)
在我的示例中,种子值在 Z1 单元格中,但当然可以在任何其他单元格中。它还允许我设置最小值和最大值。
一个实用的解决方案是将样本中的值复制到一个新的范围内。
在下面的 excel 中,公式将从均值为 10 方差为 1 的正态分布生成随机数。有没有办法设置固定种子,以便我始终获得一组固定的随机数?我正在使用 Excel 2010
=NORMINV(RAND(),10,1)
您可以使用基于 Rnd() 函数的 VBA UDF()。参见:
Repeating random variables in VBA
您可以使用电子表格函数实现您自己的随机数生成器。例如C++11有一个叫做minstd_rand
的Lehmer random number generator,它是通过递归
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 个随机正态变量:
从直方图中可以看出,分布似乎大致正常。
我并不是在假装这是一个完美的解决方案,但它对我有用。 它的美妙之处在于我可以为特定的单元格分配一个随机数:
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)
在我的示例中,种子值在 Z1 单元格中,但当然可以在任何其他单元格中。它还允许我设置最小值和最大值。
一个实用的解决方案是将样本中的值复制到一个新的范围内。