2012-06-11 27 views
4

所以,我試圖使用gmp來進行一些計算,在某些時候我需要從正態分佈生成一個僞隨機數(prn)。在gmp任意精度上生成一個正態分佈

由於gmp有一個統一的隨機變量,這已經有很大的幫助。但是,我很難選擇使用哪種方法來從統一的分佈生成正態分佈。在實踐中,我的問題是gmp只有簡單的操作,所以例如我不能使用cos或erf評估,因爲我不得不通過錯誤來實現。

我的問題是我能在多大程度上從gmp上的正態分佈生成prn,如果它非常困難,是否存在已經實現正態分佈的任意精度的lib。

由於不工作的方法(從this question檢索)的兩個例子:

Ziggurat algorithm使用F,其在這種情況下是一個非整數指數,因此不會通過GMP支持的評價。

Box–Muller Transform使用cos和sin,它們不被gmp支持。

+1

相關問題:http://stackoverflow.com/questions/75677/converting-a-uniform-distribution-to-a-normal-distribution – gcbenison

+0

我編輯了我的問題,關於該問題的更多信息。我之前看到過,現在我已經添加了一個鏈接。 –

+0

gmp支持整數,有理數和浮點數。你在用什麼? – salva

回答

1

如果你的圖書館有lnMarsaglia polar method會工作。

+1

和平方根,別忘了。雖然我認爲如果需要的話,可以實現Newton-Raphson來逼近平方根。 – Managu

1

將能夠生成N(0,1)分佈的隨機數的庫合併爲GMP的統一生成器的雙精度值。

例如,假設您的正常發生器產生0x8.F67E33Ap-1

也許,短短的這些數字是真正隨機的,所以截斷數量固定數量的二進制數字(即截斷爲16位,0x8.F67E33Ap -1 =>0x8.F67p-1)並且在範圍內均勻地生成一個數字[0x8.F67p-1, 0x8.F68p-1)

爲了更好地逼近,而不是使用均勻分佈在這裏就足夠了),並生成一個隨機數,其分佈與由這些定義的梯形相關聯兩個值。

解決該問題的另一種方法是隻生成一個1000,10000或100000個mpf值的表格,其中N(x)變爲1/n,2/n等。然後,使用均勻隨機生成器來選擇一個在這些區間內再次使用均勻或線性分佈計算選定區間內的隨機數。

+0

這不是解決這個問題的辦法,但是這是一個很好的近似。謝謝。 –

1

我結束了使用mpfr這實質上是gmp與一些更多的功能。它已經實施了正常的分配。