c++11提供的<random>實現了隨機數庫,它經過隨機數引擎類(random_number_engines)產生隨機數序列,隨機數分佈類(random-number distribution)使用隨機數引擎生成服從特定機率分佈的隨機數。ios
讓咱們看一個簡單的例子:c++
#include <iostream>
#include <random>dom
using std::cout; using std::endl;
using std::default_random_engine;函數
int main()
{
default_random_engine e;
for (size_t i = 0; i < 10; ++i) //生成十個隨機數
cout << e() << endl;
cout << "Min random:" << e.min() << endl; //輸出該隨機數引擎序列的範圍
cout << "Max random:" << e.max() << endl;
return 0;
}spa
生成的隨機數結果:3d
在例子中,隨機數類是定義在std命名空間的,因此要聲明。隨機數引擎是函數對象,這就是爲何使用e()去生成隨機數。程序每次運行都會生成相同的隨機數序列,這在必定程度有利於程序的調試,但咱們有時須要每一次運行產生的隨機數序列都是不一樣的。咱們能夠經過設置隨機數引擎的種子來改變引擎的狀態,沒有改變時是使用默認的隨機數種子,這就是爲何每一次都生成一樣的隨機數序列。從結果咱們能夠知道,默認的種子生成隨機數範圍在1-2147483646之間。調試
#include <iostream> #include <random> using std::cout; using std::endl; using std::default_random_engine; int main() { default_random_engine e; //或者直接在這裏改變種子 e(10) e.seed(10); //設置新的種子 for (size_t i = 0; i < 10; ++i) cout << e() << endl; cout << "Min random:" << e.min() << endl; cout << "Max random:" << e.max() << endl; return 0; }
設置新的種子後結果以下:c++11
在結果能夠看出,生成隨機數序列不一樣了。在這裏範圍仍是同樣的,那麼怎麼去改變生成的範圍呢?這時就可使用隨機數分佈類了。code
#include <iostream> #include <random> using std::cout; using std::endl; using std::default_random_engine; using std::uniform_int_distribution; int main() { default_random_engine e; uniform_int_distribution<unsigned> u(0, 9); //隨機數分佈對象 for (size_t i = 0; i < 10; ++i) //生成範圍爲0-9的隨機數序列 cout << u(e) << " "; cout << endl; return 0; }
結果以下:orm
這裏要注意的這個序列也是每次運行程序相同的,由於分佈對象將隨機數引擎做爲它的參數,分佈對象使用它的引擎參數生成隨機數,並將其映射到指定的分佈。
---------------------------------------------------------------------------------------------------------------------------------------
如今,讓我更深刻一點吧,在圖形上不少時候都要使用0.0-1.0的值(顏色)做爲數據,那麼怎麼生成這樣的序列呢?跟剛纔那樣,咱們可使用分佈區定義範圍。
#include <iostream> #include <random> using std::cout; using std::endl; using std::default_random_engine; using std::uniform_real_distribution; int main() { default_random_engine e; uniform_real_distribution<double> u(0, 1); //隨機數分佈對象 for (size_t i = 0; i < 5; ++i) //生成範圍爲0.0-1.0的隨機數序列 cout << u(e) << " "; cout << endl; return 0; }
結果:
在這裏分佈類改變了類型,採用的是real實數類型的分佈類,實例化爲<double>,生成0.0-1.0的double隨機數序列。若是你想要得到分佈類範圍的端點,只要簡單的成員函數min()和max()就能夠了。
隨機數的重要性質是隨機分佈,可是咱們也能夠生產非均勻分佈的隨機數序列。
下面的例子生成符合正態分佈的隨機數序列:
#include <iostream> #include <random> #include <vector> #include <string> using std::cout; using std::endl; using std::default_random_engine; using std::normal_distribution; using std::vector; using std::string; int main() { default_random_engine e; vector<unsigned> vals(9); normal_distribution<> n(4, 1.5); //正態分佈,大部分生成的隨機數落在0-8之間 for (size_t i = 0; i != 200; ++i) { unsigned v = lround(n(e)); //舍入到最近整數 if (v < vals.size()) ++vals[v]; //統計0-8數字出現的次數 } for (decltype(vals.size()) i = 0; i != vals.size(); ++i) cout << i << ": " << string(vals[i], '#') << endl; return 0; }
結果:
更多資料可看:C++Primer 5th
或者 :http://www.cplusplus.com/reference/random/?kw=random