4

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

4

2 回答 2

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 和平均值,如下所示:

double y = x * sigmaValue + averageValue;

4.)把它放在一个数组中

[randomNumberArray addObject:[NSNumber numberWithDouble:y]]

objc没有功能norminv。所以,这里需要数学。

编辑:我喜欢使用random()能够播种随机值生成器

于 2013-03-03T14:29:31.290 回答
2

让我先说,如果我错了,请纠正我!

据我了解,Box-Muller 变换依赖于源数字本身是均匀分布的,因此使用 random() 或 rand() 作为 Box-Muller 的源数据集不一定会产生均匀分布。

相反,它旨在采用一组通用的均匀分布的随机数,并产生在二维坐标系中均匀分布的独立随机数对。

维基百科:Box-Muller 变换


然而还有另一种方式:

在大多数 Unix 系统(以及 iOS 或 OSX 上的 Objective C)上使用rand48函数库:

参考资料:drand

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

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

于 2013-04-02T22:13:35.370 回答