- 在新標準之前,C/C++都依賴於一個簡單C庫函數rand來生成隨機數;此函數生成均勻分佈的僞隨機整數,每個隨機數的範圍在:0和一個系統相關的最大值(最少爲32767)之間;由於不同程序對隨機數的類型、範圍、分佈要求可能不同,此時通過rand函數轉換來滿足多種隨機數要求通常會引入非隨機性
- 定義在random頭文件中的隨機數庫,通過一組協作的類來解決上述問題:隨機數引擎類 和 隨機數分佈類;引擎類可以生成unsigned隨機數序列,分佈類使用引擎類生成指定類型的、在給定範圍內的、服從特定概率分佈的隨機數
- C++程序不應該使用庫函數rand,而應使用defaulet_random_engine類和恰當的分佈類對象
- 大多數場合下,隨機數引擎的輸出不可直接使用;因爲輸出的值範圍通常與需要的不服,也稱之爲原始隨機數;隨機數引擎有很多中,具體可見P783頁,通常defaulet_random_engine引擎操作可見test_1
- 將隨機數引擎傳遞給分佈對象,而不是引擎的下一個值;見test_2
- 一個給定的隨機數發生器一直會生成相同的隨機數序列,一個函數如果定義了局部的隨機數發生器,應將隨機數引擎和分佈對象定義爲static的。否則,每次調用函數都會生成相同的序列
- 常見的隨機數引擎和隨機數分佈在 p781-p783
#include <iostream>
#include <random>
#include <vector>
using namespace std;
void print_random_k_values(default_random_engine &rng, int k) {
for (size_t i = 0; i < k; ++i) {
cout << rng() << " ";
}
cout << endl;
}
void test_1() {
int k_value = 10;
default_random_engine rng;
print_random_k_values(rng, k_value);
int int_value = 233;
default_random_engine another_rng(int_value);
print_random_k_values(another_rng, k_value);
rng.seed(int_value);
print_random_k_values(rng, k_value);
cout << "RNG min value: " << rng.min() << endl;
cout << "RNG max value: " << rng.max() << endl;
default_random_engine::result_type rng_type = 23333;
cout << typeid(rng_type).name() << endl;
cout << typeid(rng()).name() << endl;
cout << typeid(rng).name() << endl;
}
void test_2() {
uniform_int_distribution<unsigned> u(0, 9);
default_random_engine e;
for (size_t i = 0; i < 10; ++i) {
cout << u(e) << " ";
}
cout << endl;
}
int main(int argc, char *argv[]) {
test_1();
test_2();
return 0;
}