?? rand.txt
字號:
在C++語言中,取隨機數用的是Rand()函數,另外還提供了Srand()隨機化函數。本文就這兩個函數的應用及對比作一分析。
? Rand函數
Rand()函數生成0到Rand_Max的一個無符號整數。Rand_Max是在<cstdlib>頭文件中定義的一個符號常量,其定義語句是:
/* Maximum value that can be returned by the rand function. */
#define RAND_MAX 0x7fff
可以看出,Rand_Max的值為32767,是一個兩字節整數所能表達的最大值。根據概率學,如果Rand()確實以隨機方式生成整數值,那么每次調用Rand()時,0到Rand_max之間的每個數出現的機會(概率)是一樣的。我們可以用一個例子來說明:
//Example1.1:
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
#include <iomanip>
using std::setw;
int main()
{
int i;
for (i=1;i<=10;i++)
cout << setw(10) << rand() << endl;
return 0;
}
但要注意的是,這里所取的隨機值都在32767以內。但如果你仔細運行幾遍這個程序,你會發現,每次得到的結果是一樣的。這是為何呢?函數Rnad其實是一個偽隨機數(Pseudo-random numbers),重復調用Rand會生成看上去是隨機產生的一系列數值,然而,這一系列數值會在程序執行時重復出現。這一特性看上去雖然很愚笨,但這正是證明程序能正常工作的一個關鍵。
那你要問,如何使每次運行程序得到不一樣的隨機值呢?也只有這樣,才能稱得上是真正的隨機。那就要用到我們的第二個函數Srand()――隨機化函數。下面我們就來認識這位朋友。
? Srand函數
Srand()的函數原型――void srand( unsigned int seed );
通過函數原型可以看出,Srand函數沒有返回值,在使用時,需要提供一個種子值作為參數,其種子值被定義為Unsigned int,即無符號整數。Int值至少是兩個字節,兩字節的unsigned int的取值范圍為0~65535之間,而四字節的unsigned int,其值范圍可以達到0~4294967295之間。Srand函數中內嵌了一個Rand函數,以便在每次執行程序時生成不同的隨機數系列。提供的無符號整型參數值不同,得到的隨機值也不同,這樣就保證了每次得到值的隨機性。
//Example2.1:
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
#include <iomanip>
using std::setw;
int main()
{
int i;
srand(56);
for (i=1;i<=10;i++)
cout << setw(10) << rand() << endl;
return 0;
}
通過改變隨機值,可以得到不同序列的數值。當然這個程序可以設計成讓用戶每次輸入一個種子值,這只需定義一個unsigned int型的變量即可。不過這樣的程序還是不太理想,因為每次都要求輸入種子值,顯得繁瑣。有什么辦法讓程序自取數值作為種子值呢?利用系統時間是個好辦法。C++中提供了Time()函數來獲取系統時鐘。程序如下:
//Example2.2:
#include <iostream>
#include <cstdlib>
#include <ctime>
using std::cout;
using std::endl;
#include <iomanip>
using std::setw;
int main()
{
int i;
srand(time(0));
for (i=1;i<=10;i++)
cout << setw(10) << rand() << endl;
return 0;
}
這樣程序每次運行所生成的隨機數系列會“不同”。注意:Time(0)參數0返回當前“日歷時間”的秒數。Srand函數只需在程序中調用一次,就可以獲得所需的隨機化效果,多次調用不僅徒勞無益,還會降低程序性能。
? 自定義隨機取值范圍
我們不是任何時候都需要從0~65535這么大的范圍中取隨機值,譬如統計男、女生出現可能性只需0和1兩種可能,統計七種顏色的變化只需0~6七個數值,統計投擲骰子每個數字的可能性只需1~6六個數值,諸如此類的情況有很多種,這就使我們認識到單純應用上述兩個函數無法滿足實際需要。如何來自定義隨機數的取值范圍呢?我們有一個很巧妙的方法。
我們都學過求模運算(%),利用%可以定義取值范圍,比如取1~6的值,可以用1+Rand()%6,因為余數必須比除數小,所以Rand()%6的值為0~5,加上1則值范圍為1~6。這被稱為“比例縮放”,數字6被稱為“比例因子”。我們可以對這個結果進行一般化處理:n = a + rand() % b;a 指的是“位移值”(相當于所需的連續整數范圍內的寬度值)。
綜上所述,如果我們需要隨機取值,可以使用Rand()函數,但這只是“偽隨機數”,只有用Srand()函數進行隨機化處理,才能保證每次所取的隨機數序列的隨機性。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -