我目前正在實現George Marsaglia的Ziggurat隨機數發生器的版本。儘管它被認爲是生成高質量正態分佈隨機數生成器的最快方法之一,但它充滿了循環控制代碼(即循環中的返回語句,if語句,分支等),並且它使幾次調用標準C函數,如exp()和log()。更不用說無限循環了。流水的Ziggurat隨機數發生器
這使得編譯器無法進行流水作業的代碼。最終,我覺得像一個基本的方法,比如直接使用中心極限定理,可能最終會更快,因爲它可以很容易地進行流水線操作。不幸的是,它不適用於高斯分佈的尾部,因此它不適用於我的應用程序。
有沒有人在這裏如何控制代碼和函數調用可能會減少任何想法。我目前使用的是Colin Green's implementation of the algorithm,我將它移植到了C上。我的底層統一生成器是Tiny Mersenne Twister(所以請不要告訴我使用MT,因爲我見過其他人做的,我已經在那裏了。對於正態分佈的RNG,不是統一的RNG)。
是依賴於底層RNG是64位的算法?我修改了Colin Green的實現,以便它使用浮點數而不是雙精度來節省內存,因爲我正在爲嵌入式應用程序進行編程。 – audiFanatic
它從RNG一次獲得64位,使用52作爲double的尾數,使用7來索引表(按照Doonik的改進),但是沒有理由你不能僅僅調用32位RNG兩次。 –
沒錯,我可以。但是,再一次,我的RNG最終將返回花車,而不是雙打。所以對於我來說,僅僅返回一個32位數字就沒有多大意義。 – audiFanatic