C++ 隨機數

來源:互聯網
上載者:User

標籤: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新標準引入的隨機數簡單介紹,歡迎大家一起交流分享。

本文出自 “zmh009” 部落格,請務必保留此出處http://zmh009.blog.51cto.com/11619347/1894125

C++ 隨機數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.