C++隨機數的用法

來源:互聯網
上載者:User
     學過別的進階語言的都知道,產生隨機數用的都是類似於random這樣的字元,c++也不例外,在C++中使用的是rand()函數,但是不同的是,如果在C++中只使用了例如 "int i;i=rand();"這樣,使用程式會發現每次得到的隨機數都是一樣的,據瞭解在C++中這樣做是為了方便調試。如果要每次都長生不同的隨機數,我們則需要在C++中加上"srand(time(NULL));"這條語句,他的作用是以時間為種子,產生隨機數(我們都知道時間是在不斷變化的,但兩次擷取隨機數要在1秒後,否則數值還是一樣),下面看個例子。

    該例子是:在1~100內產生一個隨機數,並指定一個數,顯示出該數在產生多少個數後出現。程式碼如下:

#include <iostream>
#define fnum 56               //要找的數為56

using namespace std;
int main()
{
  int num=0,j,k=0;
  int get_rand(); 
   srand(time(0));
   for(j=1;num!=fnum;j++,k++)          

  {
      num=get_rand();
    if(num<10)                 //靠右對齊
          cout<<" "<<num<<"  ";    
        else
          cout<<num<<"  ";
       
       
     if(j==15)                 //每行15個數
        {
          putchar('n');
          j=0;
        }
   }
    cout<<'n'<<"數字"<<fnum<<"已經找到,共產生了"<<k<<"個隨機數。"<<endl;

return 0;
}

int get_rand()
{
  int i;
  i=rand()%100+1;
  return i;   
}

///////////////////////////////////////

        所謂的“偽隨機數”指的並不是假的隨機數,這裡的“偽”是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,電腦只能產生相對的隨機數即偽隨機 數。電腦產生的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如“世上沒有兩片形狀完全相同的樹葉”,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:電腦只能產生偽隨機數而不是絕對的隨機數。

        C++中的標準庫<cstdlib>(包含在<iostream>中)提供兩個協助產生偽隨機數的函數:rand()和srand()。
函數一:int rand(void);
從srand(seed)中指定seed開始,返回一個範圍介於[seed,RAND_MAX(0x7fff))的隨機整數
函數二:void srand(unsigned seed);
參數seed是rand()的隨機種子,即用來初始化rand()的起始值。

    系統在調用rand()之前都會自動調用srand(),如果使用者在rand()之前曾調用過srand()給參數seed指定了一個值,那麼rand ()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有調用過srand(),那麼rand()就會自動調用srand (1),即系統預設將1作為偽隨機數的初始值。

    由上述可得知,如果希望rand()在每次程式運行時產生的值都不一樣,必須給srand(seed)中的參數seed指定一個變值,這個變值必須在每次 程式運行時都不一樣(比如到目前為止流逝的時間);如果我們給seed指定的是一個定值,那麼每次程式啟動並執行時候,rand()產生的隨機數都會一樣,只 不過這個值是[seed,RAND_MAX(0x7fff))範圍中的一個隨機取得的值。

    舉幾個例子說明一下,假設我們要取得0~6之間的隨機數(不包括6本身):
程式一(沒有指定seed的值):
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<<ran_num<<“ ”;
}
每次運行程式一都將輸出:5 5 4 4 5 4 0 0 4 2

程式二(指定seed為1):
srand(1);
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<<ran_num<<“ ”;
}
每次運行程式二都將輸出:5 5 4 4 5 4 0 0 4 2,跟程式一的結果完全一樣。

程式三(指定seed的值為6):
srand(6);
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<<ran_num<<“ ”;
}
每次運行程式三都將輸出:4 1 5 1 4 3 4 4 2 2,雖然值跟程式二不一樣,不過每次運行時的結果也都相同。

程式四(指定seed的值為當前系統流逝了的時間,單位為秒(time_t time(0))):
#include<ctime>
……
srand((unsigned)time(0));
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<<ran_num<<“ ”;
}
    運行程式四的時候,第一次輸出:0 1 5 4 5 0 2 3 4 2,第二次輸出:3 2 3 0 3 5 5 2 2 3,... ...每次的運行結果都不一樣,因為每次啟動程式時的時刻都不同。

關於time_t time(0)
    time_t 被定義為長整型,它將返回從1970年1月1日零時零分零秒到現在所經曆過的時間,單位為秒。比如輸出 cout<<time(0) ,將得到值約為1169174701,約等於37(年)* 365(天)* 24(小時)* 3600(秒)(月和日不計)。

關於ran_num=rand()%6
    將rand()的傳回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則很可能會得到一個非常巨大的數值 (RAND_MAX一般為32767)。一個通用的公式是:要想取得[a,b)之間的隨機整數,使用(rand()%(b-a))+ a,結果包含 a 而不含 b 。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.