0%

C++11新特性 - 随机数

本文简述 C++11 新引入的随机数生成机制

C++11 引入了两个和随机数相关的新概念, engine 和 distribution

engine

engine 是一个带状态的随机数生成器,在预定义的范围 [min, max] 以内生成随机数

engine 本身重载了 () 运算符,使用起来类似函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
default_random_engine eng;
cout << eng.min() << endl; // 1
cout << eng.max() << endl; // 2147483646

// eng 是个仿函数
cout << eng() << endl;

stringstream state;

state << eng; // 将当前状态存储到流里
cout << eng() << endl; // 182605794
cout << eng() << endl; // 1291394886

state >> eng; // 恢复状态
cout << eng() << endl; // 182605794
cout << eng() << endl; // 1291394886

为了增加随机性,我们可以使用时间戳作为 engine 的随机数种子

1
2
auto seed = steady_clock::now().time_since_epoch().count();
default_random_engine eng(seed);

我们也可以使用 engine 作为 STL 库函数的随机数发生器,例如

1
2
3
vector<int> v{1,2,3,4};
default_random_engine eng;
shuffle(v.begin(), v.end(), eng);

distribution

如果我们想要自定义生成随机数的范围,或者会生成的随机数分布有要求,则需要使用 distribution

1
2
3
4
5
6
7
default_random_engine eng;

// 正态分布均值10, 标准差3
normal_distribution<double> distrN(10.0, 3.0);

// 仿函数,参数为 engine
cout << distrN(eng);