0

查看我们应用程序中的一些遗留代码,发现了 Normal RNG 的这种奇怪的实现。我想将它换成适当的 Box-Muller 转换,但需要一些鼓励。

如您所见,它生成从 -3.875 到 +3.875 的 5 个随机数,然后将它们平均得到从 -1 到 +1 的准正态分布值。这可能是对的吗?这怎么可能奏效?为什么是 5 个样本?

有人,请解释一下:

private double GetRandomNormalNumber()
    {
      const double SPREAD = 7.75;
      const double HALFSPREAD = 3.875;
      var random = new Random();

      var fRandomNormalNumber = ((random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD) +
                                 (random.NextDouble()*SPREAD - HALFSPREAD)
                                )/5;

      return fRandomNormalNumber;
    }
4

2 回答 2

2

通过平均几个随机均匀样本来近似正态分布是标准的,这是中心极限定理的结果。通常采集 12 个样本。在你的情况下,有人决定只取五个样本,也许是为了效率。

看看在 C/C++ 中按照正态分布生成随机数

于 2013-03-12T15:17:49.343 回答
1

代码看起来是对的,它只是导致 0.0 附近的区域比范围边缘(-HALFSPREAD,HALFSPREAD)具有更高的概率。

我怀疑这 5 个数字是一个经过良好计算的值,很可能是“因为它有效”而被选中的

如果您将一个 RNG 替换为另一个,您应该能够:只要替换具有更好的实用特性,就没有人应该依赖现有 RNG 的特定输出

于 2013-03-12T15:20:49.227 回答