1 回答

TA貢獻(xiàn)72條經(jīng)驗(yàn) 獲得超92個(gè)贊
srand是初始化種子。你這個(gè)問題我們不得不談到rand函數(shù)的實(shí)現(xiàn)。
我們來看看概念性的代碼
static?unsigned?long?next?=?1;/*?如果你不?srand,那種子就默認(rèn)為1?*/ int?rand(void)?{ ????next?=?next?*?1103515245?+?12345; ????return((unsigned)(next/65536)?%?32768); } ???? void?srand(unsigned?seed)?{ ????next?=?seed; }
真正的這倆函數(shù)的實(shí)現(xiàn)比這個(gè)復(fù)雜多了,但是原理是一樣的。
其實(shí)rand函數(shù)就是種子經(jīng)過一系列計(jì)算后取余,更新種子,并返回取余后的這個(gè)值。
那么,更新種子和初始化種子有何不同呢?
初始化種子是給種子一個(gè)固定值。
我們可以清楚的知道,rand每次運(yùn)行后是自己更新種子的,經(jīng)過一系列數(shù)學(xué)原理的運(yùn)算取余等,導(dǎo)致了每次的返回值不相同,造成了隨機(jī)數(shù)的現(xiàn)象。
但是如果這樣會(huì)怎么樣?
srand(2); a?=?rand(); srand(2); b?=?rand();
a和b會(huì)相等!
原因在于生成a后種子值本來被rand更新了,但又被srand(2)設(shè)置為了2!
因?yàn)閮H僅是數(shù)學(xué)運(yùn)算,當(dāng)種子相同,即都為2時(shí),返回值是相同的。所以兩次生成的隨機(jī)數(shù)才相同。
明白了這個(gè),我們返回來看看你這個(gè)問題。
其實(shí)你也是同理的,你在函數(shù)里這么寫
int?creatnum() { srand(time(NULL)); return?rand()%10+1; }
調(diào)用的時(shí)候
a?=?creatnum(); b?=?creatnum();
實(shí)際上就是
srand(time(NULL)); a?=?rand()%10+1; srand(time(NULL)); b?=?rand()%10+1;
可以看出,雖然是時(shí)間作種子,但是由于計(jì)算機(jī)運(yùn)行速度太快了,在一秒之內(nèi)就執(zhí)行完了你這四句代碼,所以time(NULL)產(chǎn)生的秒數(shù)是相同的!
這就發(fā)生了上面那個(gè)問題。
但是如果你函數(shù)不寫srand(time(NULL));而寫在主函數(shù)里,看起來就像是
srand(time(NULL)); a?=?rand()%10+1; b?=?rand()%10+1;
生成a后種子值被rand更新了。當(dāng)然就和b不一樣了。
不懂再問。
- 1 回答
- 0 關(guān)注
- 2164 瀏覽
添加回答
舉報(bào)