天天看點

随機數(rand)和随機數種子(srand)的了解

實際開發應用時,我們代碼中有可能會使用到随機數。是以今天來看看随機數是怎麼生成的。

一、首先rand函數可以用來産生一個數,它具備這種功能。

rand相關的頭檔案為#include<stdlib.h>

rand()的内部實作是用線性同餘法做的,它不是真的随機數,因其周期特别長,故在一定的範圍裡可看成是随機的。rand()傳回一随機數值的範圍在0至RAND_MAX 間。RAND_MAX的範圍最少是在32767之間(int),用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。0~RAND_MAX每個數字被選中的機率是相同的。使用者未設定随機數種子時,系統預設的随機數種子為1。rand()産生的是僞随機數字,每次執行時是相同的,若要不同,用函數srand()初始化它。

二、srand函數用來播種随機種子,能夠産生一個随機數。(播下種子,它啥樣大家都不知道)

srand()用來設定rand()産生随機數時的随機數種子。參數seed必須是個整數,通常可以利用time(0)的傳回值或NULL來當做seed。如果每次seed都設相同值,rand()所産生的随機數值每次就會一樣。"相同的種子對應相同的數值"。

三、time函數是用來計算時間的秒數的。

此函數會傳回從公元 1970 年1 月1 日的UTC 時間從0 時0 分0 秒算起到現在所經過的秒數。如果t 并非空指針的話,此函數也會将傳回值存到t 指針所指的記憶體。

擷取随機數的代碼如下:

//設定一個随機數種子
srand((unsigned int)time(NULL));
for (int i = 0; i < 5; ++i)
{
	//産生随機數0-50之間
	printf("rand=%d\n",rand()%51);
}		
           

注意:

1)這裡的NULL還可以使用0。類型我們一般都是擷取無符号整形,這個擷取的随機數也隻能是整數。

2)srand函數不可以放入循環内部,否則(1s以内)産生的一直都是一個數(每一秒都會産生一個随機數)。

當然你如果非要這麼做,也可以在裡面加個延遲函數sleep(1);但是我覺得大可不必搞這麼複雜,是以上面的代碼是最容易實作随機數的了。

繼續閱讀