查看我们应用中的一些遗留代码,发现了这种奇怪的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;
}
答案 0 :(得分:2)
通过平均几个随机均匀样本来逼近正态分布是标准的,这是Central Limit Theorem的结果。通常,采集12个样本。在你的情况下,有人决定只采取五个样本,可能是为了效率。
查看Generate random numbers following a normal distribution in C/C++
答案 1 :(得分:1)
代码似乎是正确的,它只会使0.0周围的区域具有比范围边缘更高的概率(-HALFSPREAD,HALFSPREAD)。
我怀疑这5个数字是一个很好的计算值,很可能它被选中“因为它有效”
如果您将一个RNG替换为另一个RNG,您应该能够:只要替换具有更好的实际特征,任何人都不应该依赖现有RNG的特定输出