- 在新标准之前,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;
}