背景
rand是一個產生隨機數的函數,但嚴格意義上來說它產生的是僞隨機數,因爲計算機的隨機數都是僞隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子(小M多項式序列的週期是65535,即每次利用一個隨機種子生成的隨機數的週期是65535,當你取得65535個隨機數後它們又重複出現,即以相同的隨機種子重新開始一個週期) 。所以它不是真真意義上的隨機數,是一個僞隨機數,是根據一個數(我們可以稱它爲種子)爲基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。
此時搭配srand函數使用, srand用來設置rand()產生隨機數時的隨機數種子,通常可以利用time(0)的返回值或NULL來當做參數。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。
rand
函數原型:
int rand(void);
【說明】
rand()返回隨機數值的範圍在0至RAND_MAX (是一個宏)間。RAND_MAX的範圍最少是在32767之間(int)。用 unsigned int 雙字節是65535,四字節是4294967295的整數範圍。0~RAND_MAX每個數字被選中的機率是相同的。如果用戶未設定隨機數種子時,系統默認的隨機數種子爲1。rand()產生的是僞隨機數字,每次執行時是相同的;若要不同,用函數srand()初始化它。
srand
函數原型:
void srand(unsigned int seed);
【說明】
用來設置rand()產生隨機數時的隨機數種子,通常可以利用time(0)的返回值或NULL來當做seed。
示例:
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define MIN 1 //隨機數產生的範圍
#define MAX 10
int main()
{
int i;
srand((unsigned)time(0));
cout<<"Ten random numbers from "<<MIN<<
" to "<<MAX<<" :/n"<<endl;
for(i=0; i<10; i++) //產生隨機數
{
cout<<MIN + (int)MAX * rand() / (RAND_MAX + 1)<<"/t";
}
cout<<endl;
return 0;
}
產生一定範圍內隨機數表達式
取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b);
取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b);
- 取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)
(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)
取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1);
取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX);