2013-03-03 120 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

相關問題