【问题标题】:Setting seed for Excel random number generator为excel随机数设置种子
【发布时间】:2016-01-14 15:41:29
【问题描述】:

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

=NORMINV(RAND(),10,1)

【问题讨论】:

标签: random excel-2010 random-seed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用电子表格函数实现自己的随机数生成器。比如C++11有一个Lehmer random number generatorminstd_rand,是通过递归得到的

    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 列中的数字?
    • 没错:如果你想要一个均匀的随机分布,选择B列。
    【解决方案3】:

    我并不是假装这是一个完美的解决方案,但这对我有用。 它的美妙之处在于我可以为特定的单元格分配一个随机数:

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

    【讨论】:

      【解决方案4】:

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

      Repeating random variables in VBA

      【讨论】:

        猜你喜欢
        • 2021-03-23
        • 1970-01-01
        • 2020-03-18
        • 2014-11-21
        • 2011-06-14
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多