c++中的標準庫(包含在中)提供兩個幫助生成偽隨機數的函式: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<
每次執行程式一都將輸出: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<
每次執行程式二都將輸出: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<
每次執行程式三都將輸出:4 1 5 1 4 3 4 4 2 2,雖然值跟程式二不一樣,不過每次執行時的結果也都相同。
程式四(指定seed的值為當前系統流逝了的時間,單位為秒(time_t time(0) )):
#include
……srand((unsigned)time(0));
for(int i=0;i<10;i++)
{ran_num=rand()%6;
cout<
執行程式四的時候,第一次輸出: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 被定義為長整型,它將返回從2023年1月1日零時零分零秒到現在所經歷過的時間,單位為秒。比如輸出 cout將rand()的返回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則很可能會得到乙個非常巨大的數值 (rand_max一般為32767)。乙個通用的公式是:要想取得[a,b)之間的隨機整數,使用(rand()%(b-a))+ a,結果包含 a 而不含 b 。
C語言中隨機函式應用
time t t srand unsigned time t printf d n rand 100 第二個程式用到了乙個新的函式srand,這個函式是給隨機數產生乙個隨機種子 seed 函式原型是srand unsigned time null time的值每時每刻都不同。所以種子不同,所以,產生...
C語言中隨機函式應用
可能大家都知道c語言中的隨機函式random,可是random函式並不是ansi c標準,所以說,random函式不能在gcc,vc等編譯器下編譯通過。那麼怎麼實現c語言中的隨機函式呢?除了random函式,還有乙個rand函式,也是乙個隨機函式,可以產生從0到rand max的隨機數。includ...
隨機函式的應用
srand 初始隨機數發生器 rand 隨機數發生器 注意在c 中,當srand中的引數相同 即隨機數種子相同 時,則產生的偽隨機數列也相同 關係 srand函式用於為rand函式產生隨機數種子 使用 通常用time null 作為srand函式的傳入引數 當使用time null 作為srand函...