我在詢問是否有提高速度的方法srand(time(NULL));
函數「刷新」?我知道srand()
根據時間產生一個新的種子(所以每秒一次),但我正在尋找srand()
的替代品,可以刷新更多的時間間隔超過1秒。是否有可能在C中增加srand(time(NULL))的刷新速度?
當我運行我的程序時,它會產生它應該達到的結果,但種子基本上保持不變,因此如果程序每秒運行多次,結果保持不變。
對不起,這樣一個簡單的問題,但我無法找到一個專門針對任何網上C的答案。
我在詢問是否有提高速度的方法srand(time(NULL));
函數「刷新」?我知道srand()
根據時間產生一個新的種子(所以每秒一次),但我正在尋找srand()
的替代品,可以刷新更多的時間間隔超過1秒。是否有可能在C中增加srand(time(NULL))的刷新速度?
當我運行我的程序時,它會產生它應該達到的結果,但種子基本上保持不變,因此如果程序每秒運行多次,結果保持不變。
對不起,這樣一個簡單的問題,但我無法找到一個專門針對任何網上C的答案。
srand(time(NULL));
不是函數,而是兩個函數:time()
它返回從曆元開始的以秒爲單位的當前時間;和srand()
,它初始化隨機數發生器的種子。您正在將數字生成器的種子初始化爲當前時間,這是非常合理的事情。
但是你有幾個誤解,你實際上只需要運行srand
一次,或每隔幾分鐘最多一次,之後rand()
將繼續對自己產生更多的隨機數,srand()
只是設置一個初始種子蘭特開始。第二,如果你真的想這樣做,雖然我不明白你爲什麼會用一個函數來返回更高精度的時間。爲此,我建議gettimeofday()
。
'因此如果程序每秒運行多次 - 與第二段相矛盾。我相信OP不會在代碼中多次調用'srand()',程序會多次運行。 –
@SouravGhosh我說這樣做是錯誤的方法,用戶應該堅持每個運行更長的程序,只是運行rand()來獲得更多的隨機數。讓我更清楚 – Vality
好吧,我沒有說你錯了,只是說不要提出像'用戶應該堅持每次運行更長的程序'這樣的改變。這真的取決於節目的性質,不是嗎? –
您可以嘗試從其他來源獲取種子值。在UNIX系統上,例如,你可以獲取從/ dev /隨機的四字節值隨機:
void randomize() {
uint32_t seed=0;
FILE *devrnd = fopen("/dev/random","r");
fread(&seed, 4, 1, devrnd);
fclose(devrnd);
srand(seed);
}
在Windows下你可以使用GetTickCount()
而不是time()
。它在50ms間隔內變化(如果沒有記錯的話)。
如果您需要超過第二個精度,可以使用'gettimeofday()'而不是'time()'派生的某個值。這與'srand'完全正交。 –
函數的適當選擇將取決於操作系統 – samgak
另外:如果您擔心隨機數的質量,請不要使用rand函數(https://www.securecoding.cert.org/confluence/顯示/ C/MSC30-C。+ 0 + +不使用+的+蘭特()+函數+爲產生僞隨機+ +號碼)。 – usr2564301