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有很多公司在用嗎?
一段很有意思的代碼,你能說出為什麼結果是這樣嗎?

TAG:程序員 | 編程 | C編程語言 | C | CC |