c++11 隨機數random

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

12

在例子中,隨機數類是定義在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

12

在結果能夠看出,生成隨機數序列不一樣了。在這裏範圍仍是同樣的,那麼怎麼去改變生成的範圍呢?這時就可使用隨機數分佈類了。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

12

這裏要注意的這個序列也是每次運行程序相同的,由於分佈對象將隨機數引擎做爲它的參數,分佈對象使用它的引擎參數生成隨機數,並將其映射到指定的分佈。

---------------------------------------------------------------------------------------------------------------------------------------

如今,讓我更深刻一點吧,在圖形上不少時候都要使用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;
}

結果:

12

在這裏分佈類改變了類型,採用的是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;
}

結果:

12

 更多資料可看:C++Primer 5th

或者 :http://www.cplusplus.com/reference/random/?kw=random

相關文章
相關標籤/搜索