[轉]C++/C中產生隨機數(rand,srand用法)

來源:互聯網
上載者:User

標籤:含義   cimage   輸出   dom   時鐘   遞推公式   img   調用   檔案   

參考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
  電腦的隨機數都是由偽隨機數,即是由小M多項式序列產生的,其中產生的每個小序列都有一個初始值,即隨機種子(即根據某一個初始值代入某個公式產生一系列值),注意:小M多項式序列的周期是65535,即每次利用一個隨機種子產生的隨機數的周期是65535,當你取得65535個隨機數後,它們又會重複出現。
  我們知道rand()函數可以用來產生隨機數,但這不是真正意義上的隨機數,而是一個偽隨機數,是根據一個數(我們稱之為種子)為基準以某個遞推公式算出來的一系列數,當這系列數很大時,就符合常態分佈,從而相當於產生了隨機數,但這不是真正意義上的數,當電腦正常開機後,這個種子的值是定了的,所以隨機數也是定了的,除非你破壞了系統。

  1. rand()
    功能:隨機數產生器;  用法:int rand(void);  標頭檔:stdlib.h
    rand()的內部實現是用線性同餘法,它不是真的隨機數,因其周期特別長,故在一定範圍內可以看成是隨機的。
    rand()返回一隨機數值的範圍在0~RAND_MAX之間。RAND_MAX的範圍最少是在32676之間(int),unsigned int則為65535。0~RAND_MAX中每個數字·被選中的幾率是相同的。
    當使用者未設定隨機數種子時,系統預設的隨機數種子為1。因此rand()產生的是偽隨機數字,每次執行是相同的“?此處有問題,不理解(每次執行的含義是什麼)?”,通過運行程式驗證發現,每一次執行程式會產生一系列隨機數,但每一次運行產生的這一系列隨機數是相同的;若要不同,應該用srand()來初始化。
  2. srand()
    功能:初始化隨機數發生器 用法:void srand(unsigned int seed) 標頭檔:stdlib.h
    srand()用來設定rand()產生隨機數時的隨機數種子。參數seed必須是一個整數。如果每次seed都設定成相同值,rand()所產生的隨機數值每次就會一樣。若想使每次啟動並執行的參數seed不一樣,我們可以使用當前時鐘作為種子,因為每次已耗用時間肯定不一樣。
  • 2.1. 使用當前時鐘作為隨機數種子
    使用當前時鐘,我們可以使用標頭檔ctime或time.h裡面的time()函數
  1. 產生隨機數的方法
  • a. 給srand()提供一個種子,它是一個unsigned int類型;
  • b. 調用rand(),它會根據提供給srand()的種子值返回一個隨機數;
  • c. 根據需要多次調用rand(),從而不間斷地得到新的隨機數
  • d. 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結果
  1. 測試代碼
#include<iostream>#include<cstdlib>#include<ctime>//#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){ //   srand((int)time(NULL));    for(int i=0;i<10;i++)        cout<<rand()<<‘ ‘;        cout<<endl; //       for(int i=0;i<10;i++) //       cout<<random(1,100)<<‘ ‘;    return 0;}

結果:沒有用srand()初始化每次運行都是下面那一系列數

srand()初始化

#include<iostream>#include<cstdlib>#include<ctime>//#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){    srand((int)time(NULL));    for(int i=0;i<10;i++)        cout<<rand()<<‘ ‘;        cout<<endl; //       for(int i=0;i<10;i++) //       cout<<random(1,100)<<‘ ‘;    return 0;}

結果:每次運行產生的一系列數都不同

  1. 產生一定範圍內的隨機數
  • a. [a,b): (rand()%(b-a))+a //取隨機數對(b-a)取餘(最大為b-a-1),再加上a,,即[a,b)
  • b. [a,b]: (rand()%(b-a+1))+a;
  • c. (a,b]: (rand()%(b-a))+a+1;
  • d. (a,b): (rand()%(b-a-1))+a+1;
  • d. 通用公式: a+rand()%n ,其中a是起始值,n是範圍,注意對n取餘最大值為n-1
  • e. 要取得0~1之間的浮點數,可以使用rand()/(double)RAND_MAX
#include<iostream>#include<cstdlib>#include<ctime>#define random(a,b) (rand()%(b-a+1)+a)using namespace std;int main(){    srand((int)time(NULL));    for(int i=0;i<10;i++)        cout<<rand()<<‘ ‘;        cout<<endl;    for(int i=0;i<10;i++)        cout<<random(1,100)<<‘ ‘;    return 0;}

結果:

以上

[轉]C++/C中產生隨機數(rand,srand用法)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.