[C++] C++生成随机数

一、简介

C语言中常使用srand()+random()的方式生成随机数,该方式并不是一个很好的随据说生成方法,一方面是因为其生成的随机数质量较低,另一方面其随机数范围也有所限制。在C++11中推荐使用随机数引擎的方式生成随机数。

如何高效得生成高质量得随机数(甚至需要满足指定分布)是一个复杂的问题,本文只给出C++11中常用的用于生成均匀分布正态分布等特定分布的随机数代码,并不对随机数生成理论进行解释。

二、代码示例

1. 均匀分布uniform distribution

cpp 复制代码
#include <iostream>
#include <random>

int main()
{
    std::random_device rd;                             // 生成随机数种子
    std::mt19937 gen(rd());                            // 定义随机数生成引擎
    std::uniform_int_distribution<> distrib_int(1, 6); // 定义随机数分布,生成在[1,6]之间的的均匀分布整数
    for (int n = 0; n != 10; ++n)
    {
        std::cout << distrib_int(gen) << ' ';
    }
    std::cout << '\n';

    std::uniform_real_distribution<> distrib_real(1.0, 6.0); // 定义随机数分布,生成在[1.0,6.0]之间的的均匀分布实数
    for (int n = 0; n != 10; ++n)
    {
        std::cout << distrib_real(gen) << ' ';
    }
    std::cout << '\n';
    return 0;
}

2. 正态分布Normal distribution

生成其他分布的随机数跟生成均匀分布的随机数类似,只需要改变随机数生成器即可。生成均值为5.0,标准差为2.0的随机数可以使用以下随机数生成器:

cpp 复制代码
std::normal_distribution distrib_normal(5.0, 2.0);

3. 泊松分布Poisson distribution

cpp 复制代码
std::poisson_distribution<> d(4);

4. 离散采样分布Discrete distribution(整数)

cpp 复制代码
// 假设存在4种事件,
// 事件1发生的概率为 40/(40+10+10+40),
// 事件2发生的概率为 10/(40+10+10+40),
// 事件3发生的概率为 10/(40+10+10+40),
// 事件4发生的概率为 40/(40+10+10+40),
// 那么,采样四种事件的随机数生成器如下:
std::discrete_distribution<> d({40, 10, 10, 40});

三、参考

1\]. [cppreference Standard library header \](https://en.cppreference.com/w/cpp/header/random).

相关推荐
近津薪荼6 分钟前
优选算法——滑动窗口3(子数组)
c++·学习·算法
方便面不加香菜7 分钟前
c++入门基础
c++
雍凉明月夜14 分钟前
瑞芯微RV1106G3板端部署
c++·人工智能·深度学习
Smart-Space21 分钟前
cpphtmlbuilder-c++灵活构造html
c++·html
会叫的恐龙21 分钟前
C++ 核心知识点汇总(第四日)(循环结构)
c++·算法·循环结构
落羽的落羽25 分钟前
【Linux系统】文件IO:理解文件描述符、重定向、缓冲区
linux·服务器·开发语言·数据结构·c++·人工智能·机器学习
.小墨迹33 分钟前
apollo中速度规划的s-t图讲解【针对借道超车的问题】
开发语言·数据结构·c++·人工智能·学习
小龙报34 分钟前
【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
c语言·开发语言·数据结构·c++·算法·leetcode·链表
拼好饭和她皆失35 分钟前
图论:最小生成树,二分图详细模板及讲解
c++·算法·图论
阿猿收手吧!35 分钟前
【C++】C++原子类型隐式转换解析
java·c++