具有正态分布的随机值生成器,用于objective-c

时间:2013-03-03 13:23:11

标签: ios objective-c c normal-distribution

我想在具有正态分布的数组中生成数字。在objective-c或c中是否有任何函数可以帮助您轻松获得结果而无需任何数学运算?

2 个答案:

答案 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 ):

Reference: drand

double drand48(void);
void srand48(long int seedval);

srand48()播种生成器,drand48()生成均匀分布在[0.0 - 1.0]区间的随机数