產生隨機數在程序中頗有用,這篇文章簡單介紹一下產生隨機數的方法。ios
使用標準庫<cstdlib>中的rand()函數產生隨機數。算法
#include<iostream> #include<cstdlib> using namespace std; int main() { for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//pesudo radom return 0; }
表面上看,這段程序會產生三個隨機數,但一個有趣的事情是,每次程序運行時產生的數據都是相同的。dom
我每次運行的結果都以下:函數
能夠看出,rand()函數並不會產生一個真正的隨機數。spa
要產生真正的隨機數,須要瞭解time函數。3d
<ctime>中的time函數能夠返回一個時間。函數聲明以下指針
time_t time( time_t *timer );
參數timer是一個指針,指向時間的存儲位置。使用時參數能夠爲0。若是使用其餘整數,好比1,會產生沒法從int轉換成timme_t的錯誤。code
#include<iostream> #include<ctime> using namespace std; int main() { cout << time(0)<<endl; return 0; }
對於time函數的返回值,一把理解應該是當前的時間,但事實運行結果卻並不如所想。blog
事實上,這個結果即是當前時間,只是表示方法有所不一樣。這個值是從1970年1月1日午夜到如今的秒數。get
<cstdlib>中產生用於真正隨機數的函數srand()。函數接受一個參數做爲seed,用於控制rand()函數的算法。相同的seed會使rand()產生相同的結果。
因此,若要產生真正的隨機數,可使用時間做爲seed,這樣每次都會產生真正的隨機數了。
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { srand(time(0)); for (int i = 0; i < 3; i++) cout << rand() << endl;//truly random return 0; }
這樣,在使用了stan()以後,rand即可產生真正的隨機數了。
可使用模運算來控制隨機數的範圍。下面代碼產生了[0,10)範圍的隨機數。
rand()%10;
一個例子,展現了這篇文章說起的函數。
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { cout << time(0)<<endl;//返回一個秒數 for (int i = 0; i < 3; i++) cout << rand() << endl;//pesudo radom srand(time(0)); for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//truly random return 0; }
首先輸出一個秒數。
接着輸出了3個隨機數,這三個隨機數每次都是相同的。
使用時間做爲seed,rand()函數的返回值。
產生3個真隨機數,其範圍是[0,10)。