2012-10-15 105 views
2

我正在開發一些C語言庫,可供各種用戶應用程序使用。不使用rand()/ srand()的隨機數發生器C函數

庫應該是完全「透明的」 - 用戶應用程序可以初始化並確定,並且它不應該看到正在運行的應用程序中的任何更改。

的問題是 - 我用C srand()函數/蘭特()在庫初始化函數, 這意味着庫確實影響用戶的應用程序 - 如果用戶產生的隨機數,他們將受到影響由於rand()已被調用。

那麼,任何人都可以指向一些簡單的非GPL替代rand()中的隨機數發生器嗎?

它不一定非常強大 - 我沒有對數字做任何加密。 我正在考慮寫一些小的,非常簡單的發生器(類似於需要時間和異或的東西,並用一些素數和bla bla bla做一些事情),但我想知道是否有人有一個更體面的發電機的指針。

+0

for windows use GetTickCount()但我不確定它是否會影響GetLastError()或不。 –

+0

在Linux上從/ dev/urandom中讀取。如果這一般速度太慢,您可以使用它來播種另一種算法。 – ams

回答

3

它通過保持一些狀態並在每次調用函數時修改狀態來生成下一個數字。這樣的函數被稱爲僞隨機數生成器。創建PRNG的老方法是線性同餘發生器,這是很容易做到:

static int rand_state; 
int rand(void) 
{ 
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff; 
    return rand_state; 
} 

正如你所看到的,這個方法可以讓你預測該系列中的下一個號碼,如果你知道對上號。有更復雜的方法。

各種類型的僞隨機數發生器已被設計用於特定目的。有一些安全的PRNGs很慢但很難預測,即使你知道它們是如何工作的,也有像Mersenne Twister這樣的大型PRNG,它們具有很好的分佈特性,因此可用於編寫蒙特卡洛模擬。作爲一個經驗法則,一個線性同餘發生器足夠用於編寫一個遊戲(怪物交易會造成多少傷害),但對於編寫一個模擬程序來說還不夠好。有許多研究人員選擇貧窮的PRNG作爲他們的項目的豐富的歷史;他們的模擬結果是可疑的結果。

+0

謝謝,看起來像「線性同餘發生器」幾乎是:) – kliteyn

+0

所有的理論總結在這裏:http://en.wikipedia.org/wiki/Linear_congruential_generator – kliteyn