C rand 函式和srand 函式解讀

2021-10-06 11:05:49 字數 3347 閱讀 2755

(1)srand(unsigned int t)這個是設定種子。

因為電腦取隨機數是偽隨機,只要種子一樣,則取出來的數一定一樣。

這裡用time(0)這個內函式,copy則是返回了當前的時間值。

這個值是按照時間而變化的,所以,srand(unsigned(time(null)))這個函式的作用,就是乙個簡單的設定隨機數的種子方法。通過這個函式,可以得到每次都不容一樣zd的隨機數。

time(0)或者time(1)指c++中的一種函式。其作用是返回一特定時間的小數值。

time(0)指函式返回當前時間,如果發生錯誤返回0。

time(1)指函式返回當前時間,如果發生錯誤返回1。

(2)srand()就是給rand()提供種子seed。

如果srand每次輸入的數值是一樣的,那麼每次執行產生的隨機數也是一樣的。

以乙個固定的數值作為種子是乙個缺點。通常的做法是 :以這樣一句srand((unsigned) time(null));來取代,這樣將使得種子為乙個不固定的數,這樣產生的隨機數就不會每次執行都一樣了。

rand(void)用於產生乙個偽隨機unsigned int 整數。 

srand(seed)用於給rand()函式設定種子。

srand 和 rand 應該組合使用。一般來說,srand 用於對 rand 進行設定。 

一、rand()

函式名:   rand   

功   能:   隨機數發生器 

用   法:   int rand(void);  

所在標頭檔案: stdlib.h

函式說明 :

rand()的內部實現是用線性同餘法做的,它不是真的隨機數,因其週期特別長,故在一定

的範圍裡可看成是隨機的。

rand()返回一隨機數值的範圍在0至rand_max 間。rand_max的範圍最少是在32767之間(int)。用 

unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。0~rand_max每個數字被選中

的機率是相同的。                       

使用者未設定隨機數種子時,系統預設的隨機數種子為1。

rand()產生的是偽隨機數字,每次執行時是相同的;若要不同,用函式srand()初始化它。

#include using namespace std;

#include #include #define min 1 //隨機數產生的範圍

#define max 10

int main()

{ int i;

srand((unsigned)time(0));

cout<<"ten random numbers from "《二、srand()

函式名:   srand   

功   能:   初始化隨機數發生器   

用   法:   void srand(unsigned  int  seed);  

所在標頭檔案: stdlib.h  

函式說明:

srand()用來設定rand()產生隨機數時的隨機數種子。

引數seed必須是個整數,通常可以利用time(0)的返回值或null來當做seed。

如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

#define max 99

int main()

{ int i;

srand((unsigned)time(null));

cout<<"ten random numbers from "《三、rand()和srand()的關係

rand()和srand()要一起使用,其中srand()用來初始化隨機數種子,rand()用來產生隨機數。

因為預設情況下隨機數種子為1,而相同的隨機數種子產生的隨機數是一樣的,失去了隨機性的意義,所以為使每次得到的隨機數不一樣,用函式srand()初始化隨機數種子。srand()的引數,用time函式值(即當前時間),因為兩次呼叫rand()函式的時間通常是不同的,這樣就可以保證隨機性了。

四、產生一定範圍隨機數的通用表示公式

要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。

要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。

要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。

(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)

要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (rand_max + 1)。

要取得0~1之間的浮點數,可以使用rand() / double(rand_max)。

五、產生相同的隨機數的原因

計算機的隨機數都是由偽隨機數,即是由小m多項式序列生成的,其中產生每個小序列都有乙個初始值,即隨機種子。(注意: 小m多項式序列的週期是65535,即每次利用乙個隨機種子生成的隨機數的週期是65535,當你取得65535個隨機數後它們又重複出現了。)  

我們知道rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是乙個偽隨機數,是根據乙個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。 

#include using namespace std;

#include #include int main()

{ int i;

for (i=0; i<10; i++) //產生10個隨機數

{ cout《每次執行得到相同的隨機序列:37 21367 6474  26500 13169 34524 22678

為得到不同的隨機數序列,則需改變這個種子的值。方法:在開始產生隨機數前,呼叫一次srand(time(null))(注意:srand()一定要放在迴圈外面或者是迴圈呼叫的外面,否則的話得到的是相同的隨機數)。

#include using namespace std;

#include #include int main()

{ int i;

srand((unsigned)time(null)); //初始化隨機數種子

for (i=0; i<10; i++) //產生10個隨機數

{ cout《每次執行得到不同的隨機序列:

2372 18732 13211 1543 11560 27084 19670 15425 231 20965

2174 23514 18726 13458 21435 12659 9118 8334 2133 2353

C rand 和srand 的原理

c rand 和srand 的原理 rand rand 不需要任何引數,但是他會直接返回乙個從0 最大隨機數 的任意乙個整數.但是rand 只會產生一次,即便再次編譯,結果仍舊不便 那麼就用到了srand srand void srand unsigned seed 此處型別是unsigned 引數...

產生隨機函式srand函式和rand函式的使用

srand 初始隨機數發生器 rand 隨機數發生器 當srand 的內容相同時,則在rand 後產生相同的隨機數列 所以當用time null 來進行初始隨機數,根據時間來產生隨機數,這樣就能產生不同的。呼叫方法是srand gettickcount 但是又不能在每次呼叫rand 的時候都用sra...

srand 和rand 函式詳解

c語言 c 或 int rand void void srand unsigned seed 函式說明 rand函式產生的隨機數嚴格意義講不是真正的隨機數,它裡面採用了線性同餘法計算出隨機數,該方法有個最大週期m,也就是說該方法實在一定的範圍內生成一串數字,不過這個m一般來說比較大,所以正常使用時一...