2015-06-11 112 views
3

我在詢問是否有提高速度的方法srand(time(NULL));函數「刷新」?我知道srand()根據時間產生一個新的種子(所以每秒一次),但我正在尋找srand()的替代品,可以刷新更多的時間間隔超過1秒。是否有可能在C中增加srand(time(NULL))的刷新速度?

當我運行我的程序時,它會產生它應該達到的結果,但種子基本上保持不變,因此如果程序每秒運行多次,結果保持不變。

對不起,這樣一個簡單的問題,但我無法找到一個專門針對任何網上C的答案。

+3

如果您需要超過第二個精度,可以使用'gettimeofday()'而不是'time()'派生的某個值。這與'srand'完全正交。 –

+2

函數的適當選擇將取決於操作系統 – samgak

+1

另外:如果您擔心隨機數的質量,請不要使用rand函數(https://www.securecoding.cert.org/confluence/顯示/ C/MSC30-C。+ 0 + +不使用+的+蘭特()+函數+爲產生僞隨機+ +號碼)。 – usr2564301

回答

3

srand(time(NULL));不是函數,而是兩個函數:time()它返回從曆元開始的以秒爲單位的當前時間;和srand(),它初始化隨機數發生器的種子。您正在將數字生成器的種子初始化爲當前時間,這是非常合理的事情。

但是你有幾個誤解,你實際上只需要運行srand一次,或每隔幾分鐘最多一次,之後rand()將繼續對自己產生更多的隨機數,srand()只是設置一個初始種子蘭特開始。第二,如果你真的想這樣做,雖然我不明白你爲什麼會用一個函數來返回更高精度的時間。爲此,我建議gettimeofday()

+2

'因此如果程序每秒運行多次 - 與第二段相矛盾。我相信OP不會在代碼中多次調用'srand()',程序會多次運行。 –

+1

@SouravGhosh我說這樣做是錯誤的方法,用戶應該堅持每個運行更長的程序,只是運行rand()來獲得更多的隨機數。讓我更清楚 – Vality

+1

好吧,我沒有說你錯了,只是說不要提出像'用戶應該堅持每次運行更長的程序'這樣的改變。這真的取決於節目的性質,不是嗎? –

3

您可以嘗試從其他來源獲取種子值。在UNIX系統上,例如,你可以獲取從/ dev /隨機的四字節值隨機:

void randomize() { 
    uint32_t seed=0; 
    FILE *devrnd = fopen("/dev/random","r"); 
    fread(&seed, 4, 1, devrnd); 
    fclose(devrnd); 
    srand(seed); 
} 
+0

爲什麼不使用fread而不是fgetc? –

+0

另外,你不想使用添加,你想要使用按位或。 –

+0

值得注意的是,這依賴於某種類似UNIX的UNIX。 – Vality

3

在Windows下你可以使用GetTickCount()而不是time()。它在50ms間隔內變化(如果沒有記錯的話)。

相關問題