由隨機數分佈類、隨機數引擎類組成。
現在介紹生成整數與浮點數的隨機數。
頭文件<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新標準引入的隨機數簡單介紹,歡迎大家一起交流分享。