Pseudo-random number generation
伪随机数生成
随机数库提供了生成随机数和伪随机数的类.。这些课程包括:
- 随机数引擎%28同时产生具有均匀分布的整数序列的伪随机数生成器,如果有可用的话,则生成真正的随机数生成器。
- 随机数分布%28等。制服,,,正常,或泊松分布%29,它将随机数引擎的输出转换为各种统计分布。
引擎和分布被设计成一起用于产生随机值。所有的引擎都可以被专门地播种、序列化和反序列化,以便与可重复的模拟器一起使用。
随机数引擎
随机数引擎利用种子数据作为熵源生成伪随机数.。几种不同类别的伪随机数生成算法被实现为模板,可以定制。
选择使用哪个引擎涉及到许多权衡:线性同余引擎速度适中,状态存储需求非常小。即使在没有高级算术指令集的处理器上,滞后的斐波纳契发生器也是非常快的,而牺牲了更大的状态存储和有时不那么理想的频谱特性。Mersenne捻线器速度较慢,状态存储要求较高,但参数正确时,具有最长的非重复序列,对于给定的%29的定义,具有最理想的频谱特性%28。
随机数引擎UniformRandomBitGenerator
...
在标头中定义<random>
*。
线性[医]同余[医]引擎%28C++11%29实现线性同余算法%28类模板%29
默森[医]捻线机[医]Engine%28C++11%29实现Mersennetwister算法%28类模板%29
减法[医]带着[医]携带[医]引擎%28C++11%29用进位%28a滞后Fibonacci%29算法实现减法28类模板%29
随机数引擎适配器
随机数引擎适配器使用另一个随机数引擎作为熵源产生伪随机数.。它们通常用于改变底层引擎的光谱特性。
在标头中定义<random>
*。
弃置[医]块[医]引擎%28C++11%29丢弃一些随机数引擎%28类模板%29的输出
独立[医]位元[医]引擎%28C++11%29将随机数引擎的输出打包成指定位数的块%28类模板%29
洗牌[医]命令[医]引擎%28C++11%29按不同顺序交付随机数引擎的输出%28类模板%29
预定义随机数发生器
对几种常用的算法进行了预定义。
在标头中定义<random>
*。
类型定义
明斯特[医]RANDO STD::线性[医]同余[医]引擎<std::uint[医]扣件32[医]T,16807,16807,2147483647>于1969被路易斯、古德曼和米勒发现,1988被朴槿惠和米勒作为“最低标准”。
明斯特[医]兰德性病::线性[医]同余[医]引擎<std::uint[医]扣件32[医]T,48271,0,2147483647>更新的“最低标准”,由Park,Miller和Stockmeyer在1993推荐。
mt 19937 STD::Mersenne[医]捻线机[医]引擎<std::uint[医]扣件32[医]t,32,624,397,31,0x9908b0df,11,0xffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253>32位Mersenne Twister,松本和西村,1998。
19937[医]64性病::Mersenne[医]捻线机[医]引擎<std::uint[医]快64[医]t,64,312,156,31,0xb5026f5a96619e9,29,0x555555555555555555,17,0x71d67fffeda60000,37,0xfff7eee0000000,43,6364136223846793005>64位Mersenne Twister,松本和西村,2000。
粗大麻24[医]基本性病::减去[医]带着[医]携带[医]引擎<std::uint[医]扣件32[医]t,24,10,24>
粗关节48[医]基本性病::减去[医]带着[医]携带[医]引擎<std::uint[医]快64[医]t,48,5,12>
性病24级::报废[医]块[医]发动机<std::ranble 24[医]基地,223,23>24位RANLUX发生器,由马丁吕舍和弗雷德詹姆斯,1994.。
第48条性病::丢弃[医]块[医]发动机<std::ranble 48[医]基地,389,11>48位RANLUX发生器,由马丁吕舍和弗雷德詹姆斯,1994.。
库思[医]b性病::洗牌[医]命令[医]引擎<std::minstd[医]256>
违约[医]随机[医]引擎实现-定义
非确定性随机数
std::random_device
是一个不确定的统一随机数生成器,尽管实现是允许的。std::random_device
如果不支持非确定性随机数生成,则使用伪随机数引擎。
random_device | non-deterministic random number generator using hardware entropy source (class) |
---|
随机数分布
随机数分布后处理随机数引擎的输出,从而根据定义的统计概率密度函数分配输出。
随机数分布RandomNumberDistribution
...
在标头中定义<random>
*。
均匀分布
制服[医]INT[医]分布%28C++11%29生成整数值,分布在范围%28类模板%29之间。
制服[医]实[医]分布%28C++11%29生成在范围内均匀分布的实际值%28类模板%29
Bernoulli分布
伯努利[医]分布%28C++11%29在Bernoulli分布上产生bool值。28级%29
二项式[医]分布%28C++11%29在二项分布上生成整数值。%28类模板%29
负[医]二项式[医]分布%28C++11%29在负二项分布上产生整数值。%28类模板%29
几何学[医]分布%28C++11%29在几何分布上产生整数值。%28类模板%29
泊松分布
泊松[医]分布%28C++11%29在泊松分布上产生整数值。%28类模板%29
指数型[医]分布%28C++11%29在指数分布上产生真实值。%28类模板%29
伽马[医]分布%28C++11%29产生伽马分布的真实值。%28类模板%29
威布尔[医]分布%28C++11%29在威布尔分布上产生真实值。%28类模板%29
极端[医]价值[医]分布%28C++11%29在极值分布上产生真实值。%28类模板%29
正态分布
正常[医]分布%28C++11%29在标准正态%28高斯%29分布上产生真实值。%28类模板%29
对数正态[医]分布%28C++11%29产生对数正态分布的真实值。%28类模板%29
齐[医]平方[医]分布%28C++11%29在x-平方分布上产生实际值.。%28类模板%29
柯西[医]分布%28C++11%29在Cauchy分布上生成实际值。%28类模板%29
费舍尔[医]f[医]分布%28C++11%29在Fisher%27S F-分布上产生实际值。%28类模板%29
学生[医]T型[医]分发%28C++11%29在学生%27s分发版上生成实际值。%28类模板%29
抽样分布
离散[医]分布%28C++11%29在离散分布上产生随机整数。%28类模板%29
分片[医]常量[医]分布%28C++11%29产生按固定子间隔分配的实际值。%28类模板%29
分片[医]线性[医]分布%28C++11%29产生的实际值分布在定义的子间隔上。%28类模板%29
公用事业
在标头中定义<random>
*。
生成[医]标准%28C++11%29均匀分布给定精度的实际值。[1%,1%29%28函数模板%29
种子[医]SEQ%28C++11%29通用偏置消除置乱种子序列发生器%28类%29
C随机库
除了上面描述的引擎和发行版之外,C随机库中的函数和常量也是可用的,尽管不推荐:
在标头中定义<cstdlib>
*。
Rand生成伪随机数%28函数%29。
种子伪随机数发生器%28函数%29
兰德[医]STD生成的最大可能值::Rand%28宏常数%29
例
二次
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
int main()
{
// Seed with a real random value, if available
std::random_device r;
// Choose a random mean between 1 and 6
std::default_random_engine e1(r()
std::uniform_int_distribution<int> uniform_dist(1, 6
int mean = uniform_dist(e1
std::cout << "Randomly-chosen mean: " << mean << '\n';
// Generate a normal distribution around that mean
std::seed_seq seed2{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 e2(seed2
std::normal_distribution<> normal_dist(mean, 2
std::map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[std::round(normal_dist(e2))];
}
std::cout << "Normal distribution around " << mean << ":\n";
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
二次
可能的产出:
二次
Randomly-chosen mean: 4
Normal distribution around 4:
-4
-3
-2
-1
0 *
1 ***
2 ******
3 ********
4 *********
5 ********
6 ******
7 ***
8 *
9
10
11
12
二次
另见
伪随机数生成的C文档
*。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。