C++隨機數
C中的做法
- 之前都是使用rand()函數進行無符號隨機整數的生成,如果需要生成對應的範圍或者浮點數,需要自己進行一些修改,unsigned隨機數生成的方法如下所示。在使用中,爲了使得每次運行的結果都不一樣,我們將當前時間對應的無符號數作爲初始化的種子。
code
void randOld() { // 按照時間來初始化種子,保證每次結果不一樣 srand((int)time(0)); for (int i = 0; i < 10; i++) cout << rand() << ", "; cout << endl; }
新標準的做法
- 新標準中在頭文件
<random>
中引入了許多分佈類型,下面做一下簡要介紹。 random_device
:非確定性隨機數生成設備,可以用於生成隨機初始化的種子,保證每次的運行結果都不一樣default_random_engine
:生成隨機無符號數uniform_int_distribution
:生成某個範圍內的均勻隨機分佈的數,模板類,包含提供參數的上下限。uniform_real_distribution
:均勻隨機分佈的實數分佈生成器normal_distribution
:正態分佈- 更多的可以參考:http://www.cplusplus.com/reference/random/
code
void randNew() { random_device rd; // 非確定性隨機數生成設備 default_random_engine e1; // 使用默認的初始化種子 default_random_engine e2(rd()); // 不確定的數作爲初始化種子,每次運行結果都不一樣 for (int i = 0; i < 10; ++i) cout << e1() << " "; cout << endl; for (int i = 0; i < 10; ++i) cout << e2() << " "; cout << endl; // 整數範圍 uniform_int_distribution<> uid(-1, 1); // 包含上下限 for (int i = 0; i < 10; i++) cout << uid(e2) << " "; cout << endl; // 實數範圍 uniform_real_distribution<> udouble(-1, 0); for (int i = 0; i < 10; i++) cout << udouble(e2) << " "; cout << endl; normal_distribution<> normal(0, 2); for (int i = 0; i < 10; i++) cout << normal(e2) << " "; cout << endl; lognormal_distribution<double> lognormal(0, 1); for (int i = 0; i < 10; i++) cout << lognormal(e2) << " "; cout << endl; }