2013-03-03 80 views
3

我想将数字生成为具有正态分布的数组。 objective-c或c中是否有任何函数可以帮助轻松获得结果而不需要任何数学计算?具有正态分布的随机数生成器,用于objective-c

+0

你是真的,但我认为有一些方法可以帮助这个实现更容易 – 2013-03-03 13:31:29

+3

这可能有帮助:http://stackoverflow.com/questions/12948293/ios-gaussian-distribution-of-random-numbers – Spectravideo328 2013-03-03 13:44:56

回答

4

使用箱穆勒 - 转型:

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平均和的1标准偏差西格玛均匀分布值:如果需要的话添加西格马和平均为这样的目标分布

double x = sqrt(-2*log(u))*cos(2*pi*v); //or sin(2*pi*v) 

3.) :

double y = x * sigmaValue + averageValue; 

4.)把它放在一个数组

[randomNumberArray addObject:[NSNumber numberWithDouble:y]] 

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

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

+0

这真是一个很好的解决方案,但有一个问题:这会订购数字吗? – 2013-03-03 20:30:32

+0

不幸的是它不会。并且(对于大型数组),请考虑检查并排除u和v的值0和1.否则,日志功能将不起作用。 – JFS 2013-03-03 20:39:43

+0

事后用'[randomNumberArray sortedArrayUsingSelector:@selector(compare :)]'对它进行排序有什么问题? – JFS 2013-03-04 07:25:21

2

让我说,请纠正我,如果我错了前言本!

这是我的理解是,箱穆勒转型依赖于()的源数字是他们的自我均匀分布,因此利用随机或RAND()作为箱穆勒数据集的源将必然会产生均匀分布。

而是打算采用通用的一组均匀分布的随机数,并生成均匀分布在二维坐标系中的独立随机数对。

Wikipedia: Box-Muller Transform


然而有另一种方式:在使用的函数的rand48

在大多数Unix系统(和iOS或OSX因而目标C):

Reference: drand

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

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

+0

感谢您的有趣讨论。只要在(0,1]区间内有两个独立的均匀分布值,Box-Muller方法应该产生正态分布值,但我同意随机数发生器的源质量对结果有影响。不喜欢random()的质量,但是我需要用正态分布的数字创建相同的序列,这就是为什么我不能使用arc4random()或者其他更好的方法,我如何在iOS中实现这些Unix函数? – JFS 2013-09-06 08:04:26

+0

@randam说,srand48()和drand48()函数在iOS中可用。 – Borzh 2015-11-20 18:03:44

相关问题