首页 > 编程语言 >[C++] C++生成随机数

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

时间:2024-03-17 10:22:22浏览次数:13  
标签:std 10 40 生成 C++ 随机数 distribution

一、简介

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

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

二、代码示例

1. 均匀分布uniform distribution

#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的随机数可以使用以下随机数生成器:

std::normal_distribution distrib_normal(5.0, 2.0);

3. 泊松分布Poisson distribution

std::poisson_distribution<> d(4);

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

// 假设存在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 <random>.

标签:std,10,40,生成,C++,随机数,distribution
From: https://www.cnblogs.com/sthemmm/p/18078146

相关文章

  • C++发布订阅者模式:实现简单消息传递系统
     概述:这个C++示例演示了发布者-订阅者模式的基本实现。通过`Event`类,发布者`Publisher`发送数据,而订阅者`Subscriber`订阅并处理数据。通过简单的回调机制,实现了组件间松散耦合的消息传递。好的,我将为你提供一个简单的C++实例,演示如何使用发布者-订阅者模式。在这个例......
  • 货车运输(LCA+最大生成树)
    货车运输这题会有重边,又因为求的是尽可能大的边中的最小值,所以我们可以先用最大生成树维护,如何用最大生成树呢?可以用Kruskal和并查集,顺便处理重边,处理完重边后,可以用倍增LCA求两点之间的最大载重量处理重边时,必须把dis在x,y相同情况下大的排在前,以保证最优,用并查集find判断是否......
  • C++文件操作实战:创建、写入、读取、修改文件一应俱全
     概述:此C++示例详解文件操作:创建、删除、判断存在、写入、读取和修改文件内容。清晰演示了常见文件处理方法及源代码实现。以下是一个简单的C++实例,演示如何进行文件操作,包括创建文件、删除文件、判断文件是否存在、向文件写入内容、读取文件内容以及修改文件内容。#include......
  • C++ 简单使用Json库与muduo网络库
    C++简单使用Json库与muduo网络库C++使用Json库测试代码均在Ubuntu20上运行首先下载json.hpp的代码链接然后和你的测试代码放在同一目录下面导入方式#include"json.hpp"usingjson=nlohmann::json;json序列化代码测试1voidtest1(){jsonjs;js["id"]={1......
  • UG NX二次开发(C++)-创建样条曲线(二)-UF_MODL_create_spline使用
    系列文章目录第一章、UGNX二次开发(C++)-创建样条曲线(一)-UF_CURVE_create_spline使用第二章、UGNX二次开发(C++)-创建样条曲线(二)-UF_MODL_create_spline使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录第一章、[UGN......
  • C++ STL第三篇(搞清楚deque原理和有多少用法)
    dequeVector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许......
  • Activiti7 ID生成器
    Activiti有自己的主键生成策略总结一下主键生成策略1、act_ge_property表中next.dbid保存id的初始值(代码中用oldValue表示)2、每次获取2500个id,相当于预占了2500个id,即每次获取oldValue~oldValue+2500这个范围的id3、nextId表示下一个id,lastId表示这一批次的......
  • (C++)DP动态规划
    天下苦DP久已。​ DP非常重要,2022年蓝桥杯应该改名为DP杯,至于2023年那个我觉得应该叫做暴力杯。​ DP的核心思想在于,通过前面几个状态来推导下一个数据是什么,也就是走一步是一步。其本质实际上是记忆化搜索,但是有些玄学的事情就是,有时候记忆化会因为玄学递归问题TLE,但DP的那四......
  • c++机试一些提示
    1、优先队列的使用,头文件#include;优先队列定义:priority_queue<int,vector<int>,greater<int>>pq;(整数数据类型,小顶堆)。例题:哈夫曼树#include<iostream>#include<queue>usingnamespacestd;intmain(){intn;cin>>n;priority_queue<i......
  • 华为OD机试 C++ -文件缓存系统
    文件缓存系统前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:[email protected];备注:CSDN。题目描述请设计一个文件缓......