0

我目前正在實現George Marsaglia的Ziggurat隨機數發生器的版本。儘管它被認爲是生成高質量正態分佈隨機數生成器的最快方法之一,但它充滿了循環控制代碼(即循環中的返回語句,if語句,分支等),並且它使幾次調用標準C函數,如exp()和log()。更不用說無限循環了。流水的Ziggurat隨機數發生器

這使得編譯器無法進行流水作業的代碼。最終,我覺得像一個基本的方法,比如直接使用中心極限定理,可能最終會更快,因爲它可以很容易地進行流水線操作。不幸的是,它不適用於高斯分佈的尾部,因此它不適用於我的應用程序。

有沒有人在這裏如何控制代碼和函數調用可能會減少任何想法。我目前使用的是Colin Green's implementation of the algorithm,我將它移植到了C上。我的底層統一生成器是Tiny Mersenne Twister(所以請不要告訴我使用MT,因爲我見過其他人做的,我已經在那裏了。對於正態分佈的RNG,不是統一的RNG)。

回答

2

你可以看看我的C實現 here。主函數只有20行代碼,所以應該很容易展開循環。它還使您可以選擇使用整數或浮點數比較,取決於您機器上的更快速度。你可以插入任何後端RNG。

+0

是依賴於底層RNG是64位的算法?我修改了Colin Green的實現,以便它使用浮點數而不是雙精度來節省內存,因爲我正在爲嵌入式應用程序進行編程。 – audiFanatic

+0

它從RNG一次獲得64位,使用52作爲double的尾數,使用7來索引表(按照Doonik的改進),但是沒有理由你不能僅僅調用32位RNG兩次。 –

+0

沒錯,我可以。但是,再一次,我的RNG最終將返回花車,而不是雙打。所以對於我來說,僅僅返回一個32位數字就沒有多大意義。 – audiFanatic