2010-09-05 62 views
3

我需要在boost和boost中爲種子生成隨機數生成器(這是從int加載的)幾個進程,這是一個需要在Windows和Linux中編譯和工作的程序。從Windows和Linux中的毫秒中隨機選擇種子

我用std:time(0),它工作,但由於進程是同時運行的作業,其中一些會同時運行,產生相同的結果。

所以我需要從毫秒或其他任何跨平臺的隨機生成器爲此種子。我試過clock(),但不能完全讓它從time_t轉換爲int。

謝謝。

+0

即使在毫秒級的準確度下,2個線程可能會以相同的種子結束。 – Goz 2010-09-05 08:48:24

+0

我希望這不是安全的。 – 2010-09-05 08:48:34

+0

@Goz:Windows通常精確到32ms ... – 2010-09-05 08:49:05

回答

0

如果您從一個腳本開始所有作業。

然後,您可以在命令行上將增加的數字作爲參數傳遞。每個作業然後將此值添加到time()的結果中以生成其種子。

注意:我沒有看到OP有關安全性的任何要求。
最初的代碼是使用時間(空),這將有一個猜測種子。

int main(int argc,char* argv[]) 
{ 
    srand(time(NULL) + boost::lexical_cast<int>(argv[1])); 

    // STUFF 
} 
3

您可能最好使用平臺特定的隨機數字源。在Linux上,使用/dev/urandom並讀取幾個字節。在Windows上,獲取熵的幾個字節的簡單方法是UuidCreate

+0

Windows的等效是使用CSP,不會生成GUID。 – 2010-09-05 08:56:38

+0

是的,但如果您沒有高安全性需求,那麼生成UUID比使用CSP更簡單。請注意,Windows默認情況下不再生成順序的UUID。 – 2010-09-05 09:00:52

+0

我同意UUID更簡單,它使用PRNG而不是簡單的序列生成。但是,CSP的CryptGenRandom函數仍然等同於urandom,並且比UUID更安全。 – 2010-09-05 09:17:24