在新标准出现之前,C和C++都依赖于一个简单的C函数rand来生成随机数。此函数生成均匀分布的伪随机整数。每个随机数的范围在0和一个系统相关的最大值(至少为32767之间)。
定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类(random-number engines) 和随机数分布类(random-number distribution)。一个引擎类可以生成unsigned随机数序列,一个分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数。
注意:当我们说随机数发生器时,是指分布对象和引擎对象的组合。
对一个给定的发生器,每次运行程序它都会返回相同的数值序列。序列不变这一事实在调试时非常有用。但另一方面,使用随机数发生器的程序也必须考虑这一特性。
void special_1()
{
default_random_engine e; // 生成随机无符号数
for (size_t i = 0; i < 10; ++i)
// e()"调用"对象生成下一个随机数
cout << e() << " ";
}
void special_2()
{
// 生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution<unsigned> u(0, 9);
default_random_engine e; // 生成无符号随机整数
for (size_t i = 0; i < 10; ++i)
// 将u作为随机数源
// 每个调用返回在指定范围内并服从均匀分布的值
cout << u(e) << endl;
}
void special_6()
{
default_random_engine e; // 生成无符号随机整数
// 0到1(包含)的均匀分布
uniform_real_distribution<double> u(0, 1);
for (size_t i = 0; i != 10; ++i)
cout << u(e) << " ";
}
种子就是一个数值,引擎可以利用它从序列中一个新位置重新开始生成随机数。 为引擎设置种子有两种方式:在创建引擎对象时提供种子,或者调用引擎的seed成员。
选择种子,可能最常用的是调用系统函数time。这个函数定义在头文件ctime中。它返回从一个特定时刻到当前经过了多少秒。函数time接受单个指针参数,它指向用于写入时间的数据结构。如果此指针为空,则函数简单地返回时间。
注意:由于time返回以秒计的时间,因此这种方式只适用于生成种子的间隔为秒级或更长的应用。
default_random_engine e1(time(0)); // 稍微随机些的种子
头文件cmath中的lround函数将每个随机数舍入到最接近的整数。
void special_7()
{
default_random_engine e; // 生成随机整数
normal_distribution<> n(4, 1.5); // 均值4,标准差1.5
vector<unsigned> vals(9); //9个元素均为0
for (size_t i = 0; i != 200; ++i)
{
unsigned v = lround(n(e)); // 舍入到最接近的整数
if (v < vals.size()) // 如果结果在范围内
++vals[v]; // 统计每个数出现了多少次
}
for (size_t j = 0; j != vals.size(); ++j)
cout << j << ": " << string(vals[j], ‘*‘) << endl;
}
它是一个普通类,而非模板。此分布总是返回一个bool值。它返回true的概率是一个常数,此概率的默认值是0.5
void special_8()
{
string resp;
default_random_engine e;
bernoulli_distribution b; // 默认是50/50的机会
do {
bool first = b(e); // 如果为true,则程序先行
cout << (first ? "We go first" : "You get to go first") << endl;
// 传递谁先行的指示,进行游戏
cout << ((play(first)) ? "sorry, you lost" : "congrats, you won") << endl;
cout << "play agin? Enter ‘yes‘ or ‘no‘" << endl;
} while (cin >> resp && resp[0] == ‘y‘);
}
原文:https://www.cnblogs.com/ice036/p/14440657.html