首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

二次

代码语言:javascript
复制
#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';
    }
}

二次

可能的产出:

二次

代码语言:javascript
复制
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文档

*。

代码语言:txt
复制
 © cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券