簡體   English   中英

正確播種rand_r(int * val)方法

[英]Properly seeding rand_r(int *val) method

所以我有多個線程將使用rand_r函數。 該功能的簽名是:

int rand_r(int *val);

我試圖利用時間播種這個功能,但我遇到了各種各樣的麻煩。 任何人都可以向我解釋如何使用時間調用rand_r,或者以其他簡單方式動態調度rand_r。

謝謝!

對於可重入版本的rand_r ,種子只是狀態的初始值。每個線程需要一個種子。 創建一個種子數組,或使種子變量線程本地:

_Thread_local unsigned int seed = time(NULL);

int do_stuff()
{
    for ( ; ; )
    {
        int n = rand_r(&seed);
        // use n
    }
}

在UNIX / POSIX系統上,您可以打開/dev/urandom獲取初始隨機數,讀取足夠的字節以獲取每個線程的種子。 Microsoft Windows有一種更精細的方式來獲取這些數字。 查看CryptGenRandom了解詳細信息。 由於這些是基於系統熵,因此它們不適用於高容量隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM