@zhuanxu
2018-01-26T19:05:23.000000Z
字数 932
阅读 2460
c++11
random_device 提供 () 操作符, 用来返回一个 min() 到 max() 之间的一个数字. 如果是 Linux(Unix Like 或者 Unix) 下, 都可以使用这个来产生高质量的随机数, 可以理解为真随机数.
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
for(int n=0; n<20000; ++n)
std::cout << rd() << std::endl;
return 0;
}
标准把随机数抽象成随机数引擎和分布两部分. 引擎用来产生随机数, 分布产生特定分布的随机数 (比如平均分布, 正太分布等).
标准提供三种常用的引擎:
第一种是线性同余算法, 第二种是梅森旋转算法, 第三种带进位的线性同余算法. 第一种是最常用的, 而且速度也是非常快的; 第二种号称是最好的伪随机数生成器; 第三种没用过....
随机数引擎接受一个整形参数当作种子, 不提供的话, 会使用默认值. 推荐使用 random_device 来产生一个随机数当作种子.
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 mt(rd());
for(int n = 0; n < 10; n++)
std::cout << mt() << std::endl;
return 0;
}
//平均分布
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}