C++ 隨機數

    由隨機數分佈類、隨機數引擎類組成。

    現在介紹生成整數與浮點數的隨機數。

    頭文件<random>,使用的隨機數引擎類是std::default_random_engine,可通過()調用運算符返回隨機數,簡單的例子:

// main.cpp
#include <iostream>
#include <random>
using std::cout;
using std::ends;

int main()
{
    std::default_random_engine e;
    for (int i = 0; i < 10; ++i)
    {
        cout  << e() << ends;
    }
    return 0;
}

    此處有個問題,此處返回的隨機數是相同的,因爲沒有設置種子數。

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;

int main()
{
    std::default_random_engine e(time(nullptr)); // 設置種子數
    for (int i = 0; i < 10; ++i)
    {
        cout  << e() << ends;
    }
    return 0;
}

    此時可生成不同的隨機數,如果在生成隨機數之前時差超過1秒則隨機率高。同樣可通過e.seed(value)設置種子數,種子爲整型類型。


    如果要指定範圍可使用隨機數分佈類uniform_int_distribution,該類是模板類,有均勻分佈功能:

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;

int main()
{
    std::default_random_engine e(time(nullptr)); // 設置種子數
    std::uniform_int_distribution<unsigned> u(0,9); // 設置類型爲無符號整型,範圍爲[0,9]
    for (int i = 0; i < 10; ++i)
    {
        cout  << u(e) << ends;  // 生成0-9的隨機數
    }
    return 0;
}

    在以下的例子,隨機數是一致的:

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    std::default_random_engine e; 
    std::uniform_int_distribution<unsigned> u(0,9); // 設置類型爲無符號整型,範圍爲[0,9]
    for (int i = 0; i < 10; ++i)
    {
        cout  << u(e) << ends;  // 生成0-9的隨機數
    }
    return 0;
}

int main()
{
    for (int i = 0; i < 10; ++i)
    {
        func();
        cout << endl;
    }
    return 0;
}

    因爲default_random_engine每次都更新,每次的分佈類推動是相似的,因此隨機數是一致的,可使用靜態類型解決該問題:

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    static std::default_random_engine e; // 數據數引擎靜態類型
    std::uniform_int_distribution<unsigned> u(0,9); // 設置類型爲無符號整型,範圍爲[0,9]
    for (int i = 0; i < 10; ++i)
    {
        cout  << u(e) << ends;  // 生成0-9的隨機數
    }
    return 0;
}

int main()
{
    for (int i = 0; i < 10; ++i)
    {
        func();
        cout << endl;
    }
    return 0;
}

    此處是靜態類型,因此使用的是同一個隨機數引擎靜態類型,沒有更新同時在分佈類裏不斷推動,則產生的隨機數是不同的。


    在上處例子是整型,如果使用浮點類型double、float等則編譯錯誤。產生浮點數隨機數,使用隨機數分佈類uniform_real_distribution,該類是模板類,產生浮點隨機數,如果使用整型類型unsigned等會產生編譯錯誤:

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    static std::default_random_engine e; // 數據數引擎靜態類型
    std::uniform_real_distribution<double> u(0,1); // 設置類型爲雙精度浮點數,範圍爲[0,1]
    for (int i = 0; i < 10; ++i)
    {
        cout  << u(e) << ends;  // 生成0-9的隨機數
    }
    return 0;
}

int main()
{
    for (int i = 0; i < 10; ++i)
    {
        func();
        cout << endl;
    }
    return 0;
}


    使用隨機數分佈類和隨機數引擎類,可使用不同的功能,如均勻分佈、正態分佈,同時產生整數、浮點數等隨機數。


    以上是C++11新標準引入的隨機數簡單介紹,歡迎大家一起交流分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章