2010-10-13 49 views
3

我试图用简单的非均匀概率生成一些随机数来模拟逼真的数据用于测试目的。我正在寻找一个接受mu和sigma作为参数并返回x的函数,其中x在一定范围内的可能性遵循标准的钟形曲线或其附近。它不需要超精确或者甚至是有效的。结果数据集不需要匹配我设置的精确mu和sigma。我只是在寻找一个相对简单的非均匀随机数发生器。将可能的返回值集合限制为整数将会很好。我在那里看到很多建议,但似乎没有哪一个适合这个简单的例子。用于在正态分布的数据集中生成随机值的示例算法?

+0

有几个存在的问题是回答这个...我会运行一个或多个下来不久。 [在C/C++中生成正态分布的随机数](http://stackoverflow.com/questions/2325472/),[将均匀分布转换为正态分布](http://stackoverflow.com/questions/75677 /),[C++:生成高斯分布](http://stackoverflow.com/questions/1109446/) – dmckee 2010-10-13 02:18:51

回答

3

简而言之Box-Muller transform

首先,从区间(0得到两个独立的,均匀随机数,1],给他们打电话U和V

然后你就可以得到两个独立的单位 - 从公式正常分布的随机数

X = sqrt(-2 * log(U)) * cos(2 * pi * V); 
Y = sqrt(-2 * log(U)) * sin(2 * pi * V); 

这给你IID的随机数为亩= 0,标准差= 1;设置标准差= S,由s乘以你随机数;设置亩=米,添加米到你的随机数

0

我的第一个想法是为什么你不能使用现有的库?我相信大多数语言已经有一个用于生成正态随机数的库。

如果由于某种原因您不能使用现有的库,那么由@ellisbben概述的方法对于编程来说相当简单。甚至更简单的(近似)算法只是总结12统一编号:

X = -6 ## We set X to be -mean value of 12 uniforms 
for i in 1 to 12: 
    X += U 

X的值是大致正常的。下图显示了与正态分布相比,该算法的10^5绘制。

enter image description here

相关问题