随机数引擎

linear_congruential_engine 实现线性同余算法
mersenne_twister_engine 实现梅森缠绕器算法
subtract_with_carry_engine 实现带进位减(一种延迟斐波那契)算法
以上三个引擎都是类模板,它们第一个模板参数都是UIntType,表示生成数字的类型,且在内部被定义为result_type成员类型,其他模板参数是特定算法需要的参数。
它们的构造函数类似,以linear_congruential_engine为例说明:

linear_congruential_engine() : linear_congruential_engine(default_seed) {} (1)
explicit linear_congruential_engine(result_type value); (2)
template <class Sseq>
explicit linear_congruential_engine(Sseq& s); (3)
linear_congruential_engine(const linear_congruential_engine&); (4)(隐式声明)
构造引擎并初始化状态。
(1)默认构造函数。以 default_seed 播种引擎。
仅若 Sseq 符合种子序列要求,(3)才参与重载决议。尤其是若 Sseq 可转换为 result_type,则从候选函数集中排除该重载。

类 std::seed_seq 满足种子序列的要求。一个 seed_seq 对象消耗整数值数列,并基于消耗的数据生成请求数量的无符号整数值 i,0<=i < 2^32。产生的值分布在整个 32 位范围上,即使消耗的值接近。seed_seq 的构造函数和 generate 函数声明如下:

seed_seq();
seed_seq(const seed_seq&) = delete;
template <class InputIt>
seed_seq(InputIt begin, InputIt end);
template <class T>
seed_seq(std::initializer_list<T> il);
template <class RandomIt>
void generate(RandomIt begin, RandomIt end);

一个简单的例子:

#include <random>
#include <cstdint>
#include <iostream>
int main()
{std::seed_seq seq{1,2,3,4,5};std::vector<std::uint32_t> seeds(10);seq.generate(seeds.begin(), seeds.end());for (std::uint32_t n : seeds) {std::cout << n << '\n';}return 0;
}

回到三个随机数引擎上,它们还有一些公共的成员函数:

void seed(result_type value = default_seed);
template <class Sseq>
void seed(Sseq& seq);
用新种子值重新初始化随机数引擎的内部状态。result_type operator()();
生成伪随机数。令引擎状态前进一个位置。void discard(unsigned long long z);
令内部状态前进 z 次。等价于调用 operator() z 次并舍弃结果。static constexpr result_type min();
返回随机数引擎潜在生成的最小值。此值等于 0u 。static constexpr result_type max();
返回随机数引擎潜在生成的最大值。

此外还有以下非成员函数:

operator==
operator!=
比较两个伪随机数引擎的内部状态operator<<
operator>>
执行伪随机数引擎的流输入和输出
前者序列化引擎的内部状态为一或多个空格分隔的十进制数序列,并插入到流。后者能将十进制数序列还原为原引擎。

随机数引擎适配器

template <class Engine, size_t P, size_t R>
class discard_block_engine;
discard_block_engine 忽略基础引擎所产生的一定量数据。
生成器只从基础引擎生成的每个 P 大小的块保留 R 个数,舍弃剩余的数。
P - 块大小。必须大于 0 。
R - 每块用的数字数。必须大于 0 且不大于 P 。template <class Engine, std::size_t W, class UIntType>
class independent_bits_engine;
class independent_bits_engine 将一个随机数引擎的输出适配为具有特定比特数的数字。
W - 生成数字应有的比特数,其他位填0。必须大于零,且不大于 std::numeric_limits<UIntType>::digits。
UIntType - 生成的随机数类型。类型必须是无符号整数类型。std::independent_bits_engine<default_random_engine, 4, unsigned> e;std::cout << '[' << e.min() << ", " << e.max() << ']' << std::endl; //输出结果是[0, 15]template <class Engine, std::size_t K>
class shuffle_order_engine;
shuffle_order_engine 打乱基础引擎生成的随机数。
它维护一个大小为 K 的表,并在请求时随机地从该表派送被选择数,将它替换为基础引擎生成的数。

非确定随机数

std::random_device 是生成非确定随机数的均匀分布整数随机数生成器。
std::random_device 可以以实现定义的伪随机数引擎实现,在某些实现中可能每个 std::random_device 对象生成同一数值序列。
std::random_device 一般作为其他随机数引擎的种子使用。

random_device() : random_device(/*implementation-defined*/) {}
explicit random_device(const std::string& token);
标准期待 token 指定产生随机数字的字节设备,比如 linux 下的 /dev/random 。
random_device(const random_device& ) = delete;
random_device& operator=(const random_device&) = delete;
result_type operator()();
生成均匀分布的非确定随机值。
static constexpr result_type min();
返回随机数引擎潜在生成的最小值。此值等于 0u 。
static constexpr result_type max();
返回随机数引擎潜在生成的最大值。此值等于 std::numeric_limits<unsigned int>::max() 。

简单例子:

#include <iostream>
#include <random>int main()
{std::uniform_int_distribution<int> d(0, 10);std::random_device rd1; // 使用 RDRND 或 /dev/urandomfor(int n = 0; n < 10; ++n)std::cout << d(rd1) << ' ';std::cout << '\n';std::random_device rd2("/dev/random"); // Linux 上更慢for(int n = 0; n < 10; ++n)std::cout << d(rd2) << ' ';std::cout << '\n';
}

预定义生成器

minstd_rand0
std::linear_congruential_engine<std::uint_fast32_t, 16807, 0, 2147483647>
由 Lewis、Goodman 及 Miller 发现于 1969,由 Park 与 Miller 于 1988 采纳为“最小标准”minstd_rand
std::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647>
较新的“最小标准”,为 Park、 Miller 及 Stockmeyer 于 1993 推荐mt19937
std::mersenne_twister_engine<std::uint_fast32_t, ...
32 位梅森缠绕器,由松本与西村发现于 1998mt19937_64
std::mersenne_twister_engine<std::uint_fast64_t, ...
64 位梅森缠绕器,由松本与西村设计于 2000ranlux24_base    std::subtract_with_carry_engine<std::uint_fast32_t, 24, 10, 24>
ranlux48_base   std::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12>ranlux24
std::discard_block_engine<std::ranlux24_base, 223, 23>
24 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994ranlux48
std::discard_block_engine<std::ranlux48_base, 389, 11>
48 位 RANLUX 生成器,由 Martin Lüscher 与 Fred James 设计于 1994knuth_b
std::shuffle_order_engine<std::minstd_rand0, 256>default_random_engine
实现定义

一般来说像下面这样用:

#include <random>
#include <iostream>
int main()
{std::random_device rd;std::default_random_engine gen(rd());for(int i=0; i<10; ++i)std::cout << gen() << ' ';return 0;
}

用于产生满足特定分布数字的类/类模板/函数模板

generate_canonical

template <class RealType, size_t bits, class Generator>
RealType generate_canonical(Generator& g);
生成范围 [0, 1) 中的随机浮点值。
RealType - 浮点类型。
bits - 精度,如果该值大于RealType的精度,将使用 numeric_limits<RealType>::digits 。

简单例子:

#include <random>
#include <iostream>int main()
{std::random_device rd;std::mt19937 gen(rd());for(int n = 0; n < 10; ++n) {std::cout << std::generate_canonical<double, 10>(gen) << ' ';}
}

均匀分布

uniform_int_distribution
产生在一个范围上均匀分布的整数值。(类模板)
uniform_real_distribution
产生在一个范围上均匀分布的实数值。(类模板)

伯努利分布

bernoulli_distribution
产生伯努利分布上的 bool 值。(类)
binomial_distribution
产生二项分布上的整数值。(类模板)
negative_binomial_distribution
产生负二项分布上的整数值。(类模板)
geometric_distribution
产生几何分布上的整数值。(类模板)

泊松分布

poisson_distribution
产生泊松分布上的整数值。(类模板)
exponential_distribution
产生指数分布上的实数值。(类模板)
gamma_distribution
产生 Γ 分布上的实数值(类模板)
weibull_distribution
产生威布尔分布上的实数值。(类模板)
extreme_value_distribution
产生极值分布上的实数值。(类模板)

正态分布

normal_distribution
产生标准正态(高斯)分布上的实数值。(类模板)
lognormal_distribution
产生对数正态分布上的实数值。(类模板)
chi_squared_distribution
产生 χ2 分布上上的实数值。(类模板)
cauchy_distribution
产生柯西分布上的实数值。(类模板)
fisher_f_distribution
产生费舍尔 F 分布上的实数值。(类模板)
student_t_distribution
产生学生 t 分布上的实数值。(类模板)

采样分布

discrete_distribution
产生离散分布上的随机整数。(类模板)
piecewise_constant_distribution
产生分布在常子区间上的实数值。(类模板)
piecewise_linear_distribution
产生分布在定义的子区间上的实数值。(类模板)

以上的类或类模板使用方式都是类似的,构造函数根据参数生成概率分布函数,使用operator()()根据关联的概率分布函数生成随机数。
他们主要有以下常用成员:

成员类型result_type,operator()()的返回值。void reset();
重置分布对象的内部状态template <class Generator>
result_type operator()(Generator& g);
根据关联的概率分布函数生成随机数。由调用 g.operator() 获得熵。result_type min() const;
返回分布潜在生成的最小值。result_type max() const;
返回分布潜在生成的最大值。

看一个正态分布的例子:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
int main()
{std::random_device rd{};std::mt19937 gen{rd()};// 值最可能接近平均// 标准差影响生成的值距离平均数的分散std::normal_distribution<> d{5,2};std::map<int, int> hist;for(int n=0; n<50000; ++n){++hist[std::round(d(gen))];}for(auto &p : hist){std::cout << std::setw(2)<< p.first << ' ' << std::string(p.second/200, '*') << '\n';}return 0;
}

输出是:

-4
-3
-2
-10 **1 *******2 ***************3 ******************************4 *******************************************5 *************************************************6 *******************************************7 ******************************8 ****************9 ******
10 **
11
12
13
14

参考 cppreference.com cplusplus.com

c++11伪随机数生成库:random相关推荐

  1. 【Python 标准库学习】伪随机数生成库 — random

    欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ 随机函数在很多科学计算中都会用到,比如生成一系列随机数来计算平均值.高斯分布.伽马 ...

  2. C++ 之 伪随机数生成 <random>

    C++ 标准库提供了生成随机和伪随机数的类.这些类包括: 随机数生成类:生成均匀分布整数序列的伪随机数生成器,包括随机数引擎.随机数引擎适配器以及预定义随机数生成器. 随机数分布类:将生成器生成的数字 ...

  3. [Python标准库]random——伪随机数生成器

    Python 版本:1.4 及以后版本         random 模块基于 Mersenne Twister 算法提供了一个快速伪随机数生成器.原先开发这个生成器是为了向蒙特卡洛模拟生成输入,Me ...

  4. python random包含尾部吗_Python标准库random的方法randint(m,n)用来生成一个[m,n]区间上的随机整数。...

    [判断题]已知列表 x = [1, 2, 3],那么执行语句 x = 3 之后,变量x的地址不变 [判断题]只能对列表进行切片操作,不能对元组和字符串进行切片操作 [单选题]Which is not ...

  5. Python随机函数库random的使用

    众所周知,python拥有丰富的内置库,还支持众多的第三方库,被称为胶水语言,随机函数库random,就是python自带的标准库,他的用法极为广泛,除了生成比较简单的随机数外,还有很多功能.使用ra ...

  6. 生成随机数random学习之uniform_int_distribution,uniform_real_distribution

    在程序开发过程中,有时我们需要用到随机数,如果自己手写一个随机数容易引用重复,而c++11已经提供了一个生成随机数的库random,并且就可设置随机数的范围和类型,下面我们来学习使用两个最常用的随机数 ...

  7. CVPR 2021 Oral | GLEAN: 基于隐式生成库的高倍率图像超分辨率

    摘要 · 看点 在 CVPR 2021 上, 南洋理工大学 S-Lab 和商汤科技等提出的隐式生成库(Generative Latent Bank), 针对高倍率图像超分辨中的质量和保真度问题提出了一 ...

  8. 分享一种高效伪随机数生成算法

    我们知道C语言提供了随机数生成,另外Qt也提供了随机数的生成. 比如C语言,生成0-19随机数,如下: srand(time(nullptr)); // 从1970-01-01 00:00:00到现在 ...

  9. 一个伪随机数生成算法

    一个伪随机数生成算法 这几天逛程序员论坛,发现了不少好帖子,增长了不少知识,现拿其中一则为例说明. 某人提出一个问题,说怎么样能生成一亿个不重复的随机数呢? 问题表述起来很简单,似乎只要弄明白什么叫随 ...

  10. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

最新文章

  1. springboot controller 参数绑定
  2. PyQt5 技巧篇-按钮竖排显示方法,Qt Designer设置按钮竖排显示。
  3. 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
  4. 判断子序列不同的子序列两个字符串的删除操作编辑距离
  5. 一道问题引出的python中可变数据类型与不可变数据类型
  6. GIT 这么好用,为什么还是有人不知道怎么用它提交代码?
  7. java对象引用出错_上传图片错误:尝试在空对象引用上调用虚拟方法’java.lang.String android.net.Uri.getLastPathSegment()’...
  8. Python的多进程锁的使用
  9. arcgis运行慢_ArcGIS Pro运行较慢的诊断方法
  10. 云存储市场上演“新三国演义”
  11. 『网站设计』配色宝典
  12. 信息系统项目管理师之选择题、案例分析题备考
  13. 批处理|测试工具|局域网速度测试/网络上传与下载速度测试
  14. xp系统如何开启ftp服务器,xp系统怎么开ftp服务器
  15. python_opencv 黑白图片之白色部分单独分离
  16. python测试之道进阶_深入学习AB测试(一)-AB Testing With Python[项目实战]
  17. jQuery的ready方法实现原理分析
  18. ap导入 ebs oracle_Oracle EBS Interface/API(1)--AP Invoice费用报表类型导入
  19. 企业运维之七层负载均衡--Haproxy
  20. I帧、B帧、P帧以及IDR帧之间的关系

热门文章

  1. Rust中的所有权和借用的关系图
  2. C++实现 L1-054 福到了 (15分)
  3. 使用虚拟机连接真实服务器,太一星晨:虚拟化和应用交付演绎珠联璧合
  4. 转载防丢-caffe训练集搭建
  5. informix 访问mysql_C语言访问INFORMIX数据库
  6. 形式化方法课程学习笔记(一)|Cop的安装以及简单使用
  7. 2022化工自动化控制仪表考试试题及模拟考试
  8. 设置PyCharm背景图片
  9. solidworks背景改为纯白色
  10. 智能中线保护装置-零线电流保护器-中性线保护装置