學過別的進階語言的都知道,產生隨機數用的都是類似於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 。