產生隨機數在程序中很有用,這篇文章簡單介紹一下產生隨機數的方法。
偽隨機數
使用標准庫<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; }
表面上看,這段程序會產生三個隨機數,但一個有趣的事情是,每次程序運行時產生的數據都是相同的。
我每次運行的結果都如下:
可以看出,rand()函數並不會產生一個真正的隨機數。
要產生真正的隨機數,需要了解time函數。
time函數
<ctime>中的time函數可以返回一個時間。函數聲明如下
time_t time( time_t *timer );
參數timer是一個指針,指向時間的存儲位置。使用時參數可以為0。如果使用其他整數,比如1,會產生無法從int轉換成timme_t的錯誤。
#include<iostream> #include<ctime> using namespace std; int main() { cout << time(0)<<endl; return 0; }
對於time函數的返回值,一把理解應該是當前的時間,但事實運行結果卻並不如所想。
事實上,這個結果便是當前時間,只是表示方法有所不同。這個值是從1970年1月1日午夜到現在的秒數。
真正的隨機數
<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)。