C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数发生器种子( seed)
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数发生器种子( seed)相关的知识,希望对你有一定的参考价值。
1. 定义
种子就是一个数值,引擎可以利用它从序列中一个新位置重新开始生成随机数。支持每次运行程序都会生成不同的随机结果。
- 种子可以使用系统函数time(0)。
- 其他随机数分布
eg.
default_random_engine e1; // 使用默认种子
default_random_engine e2(2147483646); // 使用给定的种子值
// e3 和 e4 将会生成相同的序列,因为他们使用了相同的种子
default_random_engine e3;
e3.seed(32767); //调用 seed 设置为一个新种子值
default_random_engine e4(32767); //将种子值设置为 32767
for(size_t i = 0;i != 10; i++)
{
if (e1() == e2())
cout<<"unseeded match at iteeration: "<< i <<endl;
if (e3() != e4())
cout<<"seeded differs at itertion: "<< i <<endl;
}
1.1 一个好的种子
调用系统函数 time(返回从一个特定时刻到当前经过了多少秒)
eg. default_random_engine el (time (0) ); / / 稍微随机些的种子
1.2 其他随机数分布
精度不够:最常用但不正确的从 rand 获得一个随机浮点数的方法是用 rand ( )的结果除以RAND_MAX
uniform_real_distribution 类型的对象
default_random_engine e; // 生成无符号随机整数
// 0 到 1 (包含)的均匀分布
uniform_real_distribution<double >u(0,1);
for(size_t i =0;i<10;i++)
cout<<u(e)<<" ";
cout<<endl;
1.3 使用分布的默认结果类型
当我们希望使用默认随机数类型时要记得在模板名之后使用空尖括号
eg.
// 空<>表示我们希望使用默认结果类型
uniform_real_distribution<> u (0,1); //默认生成 double 值
1.4 生成非均匀分布的随机数
C++ 11 还规定了可以生成 20 种不同的分布类型
eg. 均匀分布uniform,正态分布normal,二项分布binomial,泊松分布poisson,学生分布 student
std::default_random_engine e; //引擎
std::normal_distribution<double> n(4, 1.5); //均值4, 方差1.5
std::vector<unsigned> vals(9);
for(std::size_t i=0; i != 200; ++i) {
unsigned v = std::lround(n(e)); //取整-最近的整数
if (v < vals.size())
++vals[v];
}
for (std::size_t j=0; j != vals.size(); ++j)
std::cout << j << " : " << vals[j] << std::string(vals[j], '*') << std::endl;
以上是关于C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数发生器种子( seed)的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 17 标准库特殊设施)输出补白
C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset类型
C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式
C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 返回多个值