srand和rand函數(C++)

背景

rand是一個產生隨機數的函數,但嚴格意義上來說它產生的是僞隨機數,因爲計算機的隨機數都是僞隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子(小M多項式序列的週期是65535,即每次利用一個隨機種子生成的隨機數的週期是65535,當你取得65535個隨機數後它們又重複出現,即以相同的隨機種子重新開始一個週期) 。所以它不是真真意義上的隨機數,是一個僞隨機數,是根據一個數(我們可以稱它爲種子)爲基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。
此時搭配srand函數使用, srand用來設置rand()產生隨機數時的隨機數種子,通常可以利用time(0)的返回值或NULL來當做參數。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

rand

函數原型:

int rand(void); 

【說明】
rand()返回隨機數值的範圍在0至RAND_MAX (是一個宏)間。RAND_MAX的範圍最少是在32767之間(int)。用 unsigned int 雙字節是65535,四字節是4294967295的整數範圍。0~RAND_MAX每個數字被選中的機率是相同的。如果用戶未設定隨機數種子時,系統默認的隨機數種子爲1。rand()產生的是僞隨機數字,每次執行時是相同的;若要不同,用函數srand()初始化它。

srand

函數原型:

void srand(unsigned  int  seed);  

【說明】
用來設置rand()產生隨機數時的隨機數種子,通常可以利用time(0)的返回值或NULL來當做seed。
示例:

    #include <iostream>  
    using namespace std;  
    #include   <stdlib.h>      
    #include   <time.h>   
    #define MIN 1    //隨機數產生的範圍      
    #define MAX 10  

    int main()     
    {   
        int i;   
        srand((unsigned)time(0));  
        cout<<"Ten random numbers from "<<MIN<<  
              " to "<<MAX<<" :/n"<<endl;     
        for(i=0; i<10; i++)          //產生隨機數  
        {  
            cout<<MIN + (int)MAX * rand() / (RAND_MAX + 1)<<"/t";   
        }  
        cout<<endl;  
        return   0;     
    }   

產生一定範圍內隨機數表達式

  • 取得[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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章