我想将数字生成到具有正态分布的数组中。Objective-c 或 c 中是否有任何函数可以帮助轻松获得结果而无需任何数学?
问问题
1878 次
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 的源数据集不一定会产生均匀分布。
相反,它旨在采用一组通用的均匀分布的随机数,并产生在二维坐标系中均匀分布的独立随机数对。
然而还有另一种方式:
在大多数 Unix 系统(以及 iOS 或 OSX 上的 Objective C)上使用rand48函数库:
double drand48(void);
void srand48(long int seedval);
srand48() 生成生成器的种子,drand48() 生成在区间 [0.0 - 1.0] 上均匀分布的随机数
于 2013-04-02T22:13:35.370 回答