我想在具有正态分布的数组中生成数字。在objective-c或c中是否有任何函数可以帮助您轻松获得结果而无需任何数学运算?
答案 0 :(得分:4)
使用Box-Muller-Transformation:
1。)你需要两个均匀分布的随机数u和v作为区间(0,1)中的双精度数(0需要排除):
double u =(double)(random() %100000 + 1)/100000; //for precision
double v =(double)(random() %100000 + 1)/100000; //for precision
2.)计算均匀分布值,平均值为0,标准差sigma为1:
double x = sqrt(-2*log(u))*cos(2*pi*v); //or sin(2*pi*v)
3.。)如果需要,为您的目标分布添加sigma和average,如下所示:
double y = x * sigmaValue + averageValue;
4。)把它放在一个数组
中[randomNumberArray addObject:[NSNumber numberWithDouble:y]]
objc没有函数norminv
。所以,这里需要数学。
编辑:我喜欢使用random()
来播种随机值生成器
答案 1 :(得分:2)
让我先说一下,如果我错了,请纠正我!
我的理解是Box-Muller转换依赖于源数量,它们是自己均匀分布的,因此使用random()或rand()作为Box-Muller的源数据集将 NOT 必然会产生统一的分布。
它旨在采用一组通用的均匀分布的随机数,并生成在2D坐标系统中均匀分布的独立的随机数对。
Wikipedia: Box-Muller Transform
还有另一种方式:
使用 rand48 函数库,在大多数Unix系统上(,因此iOS或OSX上的Objective C ):
double drand48(void);
void srand48(long int seedval);
srand48()播种生成器,drand48()生成均匀分布在[0.0 - 1.0]区间的随机数