2012-06-16 50 views
2

我正在尋找一個相當於Windows上的drand48。所有的不知道是誰,下面是不等價的:在Windows上drand48

(double)rand()/RAND_MAX; 

首先,蘭特返回值,包括RAND_MAX 其次,在Windows RAND_MAX = 32767這是我的應用程序過短的時期。

我的目的是爲模擬產生噪音。最好使用週期與drand48相同的僞隨機發生器。

回答

5

首先,請注意,您似乎將分辨率與週期混淆。在Windows上,rand將返回從0到32767的值,但這並不意味着每32768次調用會重複相同的值。所以蘭德應該是完全足夠的,除非你需要超過16位的分辨率。 (分辨率和週期在drand48中是相同的,但不是在所有僞隨機數發生器中。)

如果您不需要drand48的確切行爲,那麼rand_s將是最簡單的選項。它具有32位分辨率,比drand48小,但對於大多數用途來說足夠了。它生成一個密碼安全的隨機數,所以沒有固定的時間段。一個可能的問題是它會比drand48慢得多。

如果你想要drand48的相同行爲,algorithm is documented應該很容易重新實現,或者你可以使用source code from FreeBSD(鏈接到http://fxr.watson.org/上的源代碼瀏覽器)。

+0

我從glibc複製了源代碼。 – user877329

+1

這是我的實現(也基於FreeBSD):https://gist.github.com/mortennobel/8665258 – Mortennobel

0

它可能不是您的問題的確切答案,但它仍然是一個解決方案。使用CryptGenRandom(它是WinAPI的形式)。

+2

否 - 請**不要**使用CryptGenRandom(或任何返回隨機*字節*的函數),然後使用這些字節作爲所謂的「隨機」浮動單精度或雙精度數字的字節表示。 –