C語言 C++?
為什麼srand()函數放循環里不會重製種子 放循環外面就好了 這是為什麼
因為循環太快了,time(0)返回的值都一樣。一樣的種子,第一個出來的隨機數當然也是一樣的。
是這樣:
srand(seed):
aGlobalVar = seed
rand():
return aGlobalVar = someMagicCalc(aGlobalVar)
你的 seed 是一樣的,所以 aGlobalVar 是一樣的,經過一次 someMagicCalc 調用之後,還是一樣的。
srand只需要設置一次,之後就能用rand生產一系列隨機數
如果你丟在循環里的話,就等於一直用相同的種子來初始化隨機數,所以當然每次結果都一樣
time(0)返回的是當前時間用秒表示。
你這個循環應該超不過1秒就可以執行完,所以srand的種子都用的一樣的。
如果你看不懂輪子哥的答案,我建議你先去學習一下偽隨機數和種子的概念…
我來幫輪子哥解釋一下吧。
srand 是初始化隨機數種子,生成好一個序列。 rand() 是從偽隨機序列中取下一個隨機值。
LZ 第一段代碼,約等於
srand(1516200880); // 初始化種子,時間我隨便寫的。生成了一個偽隨機數序列
// 假設是 43 114 64 78
rand(); // 取序列中下一個隨機數 43// 這時候 再調用 rand() 就是取到 114 了
srand(1516200880); // 初始化種子.時間和之前一樣,因為循環跑得快時間沒變,
// 隨機數序列又是 43 114 64 78
rand(); // 又取到 43 了
srand(1516200880); // 初始化種子.時間和之前一樣,因為循環跑得快時間沒變
rand(); // 又取到 43 了
。。。
LZ 第二段代碼,才是正確用法
srand(1516200880); // 隨機數序列是 43 114 64 78
rand(); // 取到 43,
rand(); // 取到 114
rand(); // 取到64
LZ 還有啥不明白的么, 可以百度偽隨機
能百度解決的問題還是別在知乎上了吧
偽隨機數不是這麼用的
其背後的機制是
srand會指定一個種子rand會使用種子計算一個偽隨機數,並將該偽隨機數設為新的種子關鍵在於每次生成的偽隨機數和用的種子之間是確定的函數關係,這個偽隨機數是用種子算出來的,這個算的過程是確定而不隨機的
因此使用相同的兩個種子,生成的第一個偽隨機數是相同的輪子哥答得那麼好 都不好意思回答了補充一個沒卵用的解決方案 time(0)*a或time(0)+a這樣每次就不一樣了……cpp的話還是建議用stl的random庫吧……不用考慮細節而且c的隨機函數不OO(哎 別打我啊)
知乎現在都可以外包工作了
srand()函數生成隨機數時,如果隨機數種子相同,其返回的隨機數也是相同的. 你在一個小循環里用time(0)獲取種子,每次都一樣,所以生成的隨機數也就相同嘍!
對確定的種子生成的隨機序列也是確定的,放在循環里在一秒內你會不斷取出相同種子生成的序列的第一個數,肯定是一樣的,以及為了保證生成隨機數分布均勻,盡量不要在獲取一個隨機序列中途更換種子
題主這個界面怎麼調的?我也想調成這種顏色
推薦閱讀:
※為什麼很多大牛在寫題的時候要加一堆宏?
※在 Windows 下鍵入 Enter 鍵,是在鍵盤緩衝區中存入
還是
兩個?
※為什麼用C/C++編寫的程序只能用鍵盤輸入,而且輸出結果也只能在一個黑屏上顯示是一些字元?
※現在C++11/14有很多公司在用嗎?
※一段很有意思的代碼,你能說出為什麼結果是這樣嗎?