C++中rand() 函數的用法
1、rand()不需要參數,它會返回一個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的一個大整數。
2、如果你要產生0~99這100個整數中的一個隨機整數,可以表達為:int num = rand() % 100;
這樣,num的值就是一個0~99中的一個隨機數了。
3、如果要產生1~100,則是這樣:int num = rand() % 100 + 1;
4、總結來說,可以表示為:int num = rand() % n +a;
其中的a是起始值,n-1+a是終止值,n是整數的范圍。
5、一般性:rand() % (b-a+1)+ a ; 就表示 a~b 之間的一個隨機整數。
由於隨機數范圍RAND_MAX(win下為32767)與編譯器平台有關,如果我們需要更大范圍的隨機數,可以直接想乘等辦法.
(int)round(1.0rand()/RAND_MAX(b-a+1)+a)
6、若要產生0~1之間的小數,則可以先取得0~10的整數,然后均除以10即可得到“隨機到十分位”的10個隨機小數。
若要得到“隨機到百分位”的隨機小數,則需要先得到0~100的10個整數,然后均除以100,其它情況依 此類推。
7、通常rand()產生的隨機數在每次運行的時候都是與上一次相同的,這樣是為了便於程序的調試。
若要產生每次不同的隨機數,則可以使用srand( seed )函數進行產生隨機化種子,隨着seed的不同,就能夠產生 不同的隨機數。
8、還可以包含time.h頭文件,然后使用srand((unsingned)time(NUll))來使用當前時間使隨機數發生器隨機化,這樣就可以保證每兩 次運行時可以得到不同的隨機數序列,同時這要求程序的兩次運行的間隔超過1秒。
9、舉例如下:
rand(產生隨機數)
表頭文件: #include
定義函數 :int rand(void)
函數說明 :
因為rand() 的內部實現是用線性同余法做的,它不是真的隨機數,只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,
rand() 會返回一隨機數值,范圍在 0 至 RAND_MAX 間。
在調用此函數產生隨機數前,必須先利用 srand()設置好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為 1。
rand()產生的是假隨機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函數就是 srand()。
返回值:
返回 0 至 RAND_MAX 之間的隨機整數值,RAND_MAX 的范圍最少是在 32767 之間(int),即雙字節(16位數)。
若用unsigned int 雙字節是 65535,四字節是 4294967295 的整數范圍。
0~RAND_MAX 每個數字被選中的機率是相同的。
范例1:
/* 產生介於 1 到 10 間的隨機數值,此范例未設隨機數種子,完整的隨機數產生請參考 srand()*/
#include
int main()
{
int i,j;
for(i=0; i<10; i++)
{
j=1+(int)(10.0 * rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
執行:
9 4 8 8 10 2 4 8 3 6
9 4 8 8 10 2 4 8 3 6 //再次執行仍然產生相同的隨機數
范例2:
/* 產生介於 1 到 10 間的隨機數值,此范例與執行結果可與 rand()參照*/
#include
#include
int main()
{
int i,j;
srand((int)time(0));
for(i=0; i<10; i++)
{
j=1+(int)(10.0 * rand()/(RAND_MAX+1.0));
printf(" %d ",j);
}
}
執行:與 rand() 范例比較:
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7 //再次執行仍然產生相同的隨機數
范例3:
/* 產生介於10000 到 60000間的隨機數值,此范例與執行結果可與 rand()參照*/
#include
#include
int main()
{
int i,j;
srand((int)time(0));
cout<<RAND_MAX;
int a=10000,b=60000;
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
cout<<(int)round(1.0*rand()/RAND_MAX*(b-a+1)+a)<<endl;
}
return 0;
}
執行:與 rand() 范例比較:
3276754888
20731
58260
14007
46238
12702
14053
12130
23396
12446