我需要在boost和boost中爲種子生成隨機數生成器(這是從int加載的)幾個進程,這是一個需要在Windows和Linux中編譯和工作的程序。從Windows和Linux中的毫秒中隨機選擇種子
我用std:time(0)
,它工作,但由於進程是同時運行的作業,其中一些會同時運行,產生相同的結果。
所以我需要從毫秒或其他任何跨平臺的隨機生成器爲此種子。我試過clock()
,但不能完全讓它從time_t
轉換爲int。
謝謝。
我需要在boost和boost中爲種子生成隨機數生成器(這是從int加載的)幾個進程,這是一個需要在Windows和Linux中編譯和工作的程序。從Windows和Linux中的毫秒中隨機選擇種子
我用std:time(0)
,它工作,但由於進程是同時運行的作業,其中一些會同時運行,產生相同的結果。
所以我需要從毫秒或其他任何跨平臺的隨機生成器爲此種子。我試過clock()
,但不能完全讓它從time_t
轉換爲int。
謝謝。
如果您從一個腳本開始所有作業。
然後,您可以在命令行上將增加的數字作爲參數傳遞。每個作業然後將此值添加到time()的結果中以生成其種子。
注意:我沒有看到OP有關安全性的任何要求。
最初的代碼是使用時間(空),這將有一個猜測種子。
int main(int argc,char* argv[])
{
srand(time(NULL) + boost::lexical_cast<int>(argv[1]));
// STUFF
}
您可能最好使用平臺特定的隨機數字源。在Linux上,使用/dev/urandom
並讀取幾個字節。在Windows上,獲取熵的幾個字節的簡單方法是UuidCreate
。
Windows的等效是使用CSP,不會生成GUID。 – 2010-09-05 08:56:38
是的,但如果您沒有高安全性需求,那麼生成UUID比使用CSP更簡單。請注意,Windows默認情況下不再生成順序的UUID。 – 2010-09-05 09:00:52
我同意UUID更簡單,它使用PRNG而不是簡單的序列生成。但是,CSP的CryptGenRandom函數仍然等同於urandom,並且比UUID更安全。 – 2010-09-05 09:17:24
即使在毫秒級的準確度下,2個線程可能會以相同的種子結束。 – Goz 2010-09-05 08:48:24
我希望這不是安全的。 – 2010-09-05 08:48:34
@Goz:Windows通常精確到32ms ... – 2010-09-05 08:49:05