C 揭秘rand 函式

2022-03-31 06:13:43 字數 2513 閱讀 8076

相信只要是程式猿都會知道rand()函式是用來取隨機數的乙個庫函式,但是它出的結果真的是一組隨機數嗎?我們來看看這段**執行的結果:

1 #include2 #include3

int main(void)4

10 }

linux下gcc每次執行結果如下:

windows vc6.0每次執行結果如下:(本人windows系統為64位機)

(由於編譯器的不同,可能顯示的結果也不同吧!)

rand()函式不是隨機的嗎?怎麼每次執行的結果都是一樣的?其實計算機也不像人們想象的那麼智慧型,它也是按照人們的思想來隨機出數的。本人在linux下查詢標頭檔案沒有找到rand()函式的定義,上網查了一下也沒找到,說是被封裝到庫中了。若是有大牛們看到這篇文章,請幫幫小弟解決心中的疑問吧!

那麼如何用rand()函式獲取你想要的取值範圍呢?其實rand()函式的取值範圍在0~rand_max之間;

那麼什麼是rand_max呢?

linux下的rand_max值為2147483647(二進位制32位)

windows下的rand_max值為32767(二進位制16位)

由此可見rand_max是根據編譯器對int型分配的空間而定的;這種說法應該也是錯的,因為我在windows下的vc中列印sizeof(int)的值之後竟然顯示4,也就是說int在vc中的儲存空間應該是32位,所以我認為是vc編譯器對rand()函式的定義做了修改,使rand_max的值更小,方便了開發者的取值;(下面會介紹為什麼編譯器這樣做)

我們知道了rand()函式的取值範圍後,如何取得你想要的數值範圍呢?我們取0~10的值好了。正常的思路如下,10*rand()/(rand_max+1)+1(用10乘以rand()取得的隨機數,然後除以rand_max,再加1),應該是這樣的了。**如下:

1 #include2 #include3

int main(void)4

1213 }

執行結果如下:

好像也達到我們的效果了。但是如果把這段**放到linux下用gcc編譯又是什麼樣的結果呢?

同樣的**,我們來看看結果

這是怎麼回事?為什麼同樣的**,到了另乙個編譯器後就不一樣了?

還記得我們剛才分別在這兩個編譯器中求的rand_max的值嗎?對,vc中是32767,而gcc中是2147483647。這時候你該問了跟這個有關係嗎?我可以十分肯定的告訴你,相當的有關係。我們來寫個小程式驗證我的猜想吧!**如下:

1 #include2 #include3

int main(void)4

13 }

執行結果如下:

你看出有什麼不一樣了嗎?對,這就是vc為什麼對rand()函式的rand_max的值進行修改了。在gcc中rand()的取值範圍是0~32位的二進位制數,如果拿這個隨機數乘以10的話,很可能會發生數值溢位,也就是說gcc中int的值最大就取到2147483647,如果乘以10的話,只能接著往後排列了,-2147483647、-2147483646、-2147483645········一直到取得的那個值。所以會得到一些負數。

到了這裡我想你應該知道解決的辦法了吧~!沒錯,就是用乙個double型別的數來接收rand()*10,我們沒辦法改變rand_max的值,我們可以用更大的數來表示rand()*10。

這下應該可以了吧,我們修改一下**看看效果:

1 #include2 #include3

int main(void)4

10 }

執行結果如下:

對,這就是我們想要的結果了!

ps——函式會隨著編譯器的不同而效果不同,但是它終究逃不過開發者的眼睛,注意細節。

附加:取0-1之間的浮點型值:

1 #include 2 #include3 #include4

5int main(void)6

14 }

srand()函式是設定隨機數的種子,由前面的推論可知rand()函式只是乙個偽隨機函式,srand()函式就是為rand()函式設定種子;time()函式是獲取當前的時間,因此第九行**就是為rand()函式設定乙個根據系統時間變化的隨機種子,這樣**在每次執行的時候的結果都不會一樣了!

c語言rand函式

include include includemain 其實rand一點都不隨機 一直都是410 184670 63340 265000 191690 press any key to continue 函式說明 因為rand的內部實現是用線性同餘法做的,他不是真的隨機數,只不過是因為其週期特別長,...

c 隨機函式rand

一 c 中不能使用random 函式 random函式不是ansi c標準,不能在gcc,vc等編譯器下編譯通過。但在c語言中int random num 可以這樣使用,它返回的是0至num 1的乙個隨機數。可改用c 下的rand函式來實現。1 c 標準函式庫提供一隨機數生成器rand,返回0 ra...

C 隨機函式rand()

每次生成的隨機數都相同 include include rand intmain 每次生成的隨機數都不同 include include include time intmain include include include intmy rand2 a 0 放陣列的組長 include inclu...