標籤: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++ 隨機數