首页 > 编程语言 >C++标准库:random

C++标准库:random

时间:2024-11-01 18:57:31浏览次数:1  
标签:std engine random C++ 标准 分布 随机数 distribution

随机数生成设备

随机数生成设备random_device,生成非确定性随机数,在Linux中通过读取/dev/urandom设备,Windows中使用rand_s

重载了()运算符,每次调用会生成一个min()max()之间的高质量随机数种子,若在Linux(Unix Like)下,可以使用这个生成高质量的随机数,可以理解为真随机数,windows下就无所谓了

随机数引擎类

  • 由编译器厂家实现
    default_random_engine
  • 线性同余引擎算法
    linear_congruential_engine
  • 梅森旋转算法
    mersenne_twister_engine
  • 带进位的线性同余算法
    subtract_with_carry_engine
  • 基于梅森旋转算法
    生成周期更长的伪随机数,质量高,但是速度较慢
    std::mt19937
    std::mt19937_64 64 bit 版本

除了使用random_device,还可以用time()生成随机数种子

default_random_engine dre(time(NULL));

由于time()返回以秒计的时间,该方式只适用于生成种子的间隔为秒级或更长的场景

随机数分布类

将随机数引擎生成的随机数序列映射到常见的分布

  • 均匀分布
    std::uniform_int_distribution<>
    整数均匀分布,若使用无参构造,则范围为[0,numberic_limits::max()]
    std::uniform_real_distribution<>
    浮点数均匀分布,默认为double,若使用无参构造,则范围为[0,1)
  • 伯努利类型
    伯努利分布std::bernoulli_distribution
    二项分布std::binomial_distribution
    几何分布std::geometry_distribution
    负二项分布std::negative_biomial_distribution
  • 正态分布相关
    正态分布std::normal_distribution<>
    卡方分布chi_squared_distribution
    柯西分布cauchy_distribution
    费歇尔F分布fisher_f_distribution
    t分布student_t_distribution
  • 分段分布
    离散分布discrete_distribution
    分段常数分布piecewise_constant_distribution
    分段线性分布piecewise_linear_distribution
  • 其他分布
    泊松分布poisson_distribution
    指数分布exponential_distribution
    伽马分布gamma_distribution
    威布尔分布weibull_distribution
    极值分布extreme_value_distribution

如下函数,用于生成随机数

vector<unsigned> bad_randVec() {
    default_random_engine engine;
    uniform_int_distribution<unsigned> ui_distr(0,9);
    vector<unsigned> ret;
    for(size_t i = 0;i<100;i++)
        ret.push_back(ui_distr(engine));
    return ret;
}

每次调用bad_randVec()函数时,都会生成相同的随机数,若想每次调用该函数能获取到不同的随机数,应将engineui_distr定义为static,保持变量状态,从而每次调用都生成新的随机数,如下good_randVec()

vector<unsigned> good_randVec() {
    static default_random_engine engine;
    static uniform_int_distribution<unsigned> ui_distr(0,9);
    vector<unsigned> ret;
    for(size_t i = 0; i<100;i++)
        ret.push_back(ui_distr(engine));
    return ret;
}

示例如下

#include<random>
#include<ctime>
#include<functional>

int main() {
    // std::random_device rd;
    // std::default_random_engine eng(rd());

    // std::default_random_engine eng(1);

    std::default_random_engine eng(time(NULL));

    std::uniform_int_distribution<int> distr(1,10);

    auto func= bind(distr, eng);
    for(int i=0; i<10; ++i){
        std::cout<<func()<<std::ends; // distr(eng);
    }

    return 0;
}

注:若想在类中初始化uniform_int_distribution,可在构造函数初始化列表中进行

标签:std,engine,random,C++,标准,分布,随机数,distribution
From: https://www.cnblogs.com/sgqmax/p/18521081

相关文章

  • Chromium 中chrome.topSites扩展接口定义c++
    一、chrome.topSites使用 chrome.topSites API访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。权限topSites您必须声明“topSites”扩展程序清单中授予使用此API的权限。{ "name":"Myextension", ... "permissions":[ ......
  • 06程序IPO模式与C++顺序结构
    一、程序IPO模式编程IPO是指输入、处理和输出(Input,Process,Output)的概念。在计算机编程中,IPO是一种常用的设计模式,用于描述程序的基本流程。具体来说,IPO指的是程序从接受输入数据开始,经过一系列处理计算,最终产生输出结果的过程。IPO模式的组成部分:-输入(Input):在这个阶段......
  • 复合结构(C++ Primer)
    复合结构(C++Primer)使用结构体和string使用结构体示例代码:#include<iostream>#include<string>usingnamespacestd;structperson{stringfn;stringsn;chargrade;intage;};intmain(){person*a=newperson;cout<<"what......
  • 【C++】——高效构建与优化二叉搜索树
    活着就意味必须要做点什么,请好好努力。——村上春树《地下》目录1、二叉搜索树BST1.1什么是二叉搜索树1.2BST的性能功能分析2、二叉搜索树的实现2.1BST框架2.2BST插入2.3BST搜索2.4BST删除2.5BST细节问题3、二叉搜索树遍历3.1中序遍历3.2前序遍历3.3......
  • sklearn当中fit_transform和transform方法的区别;数据标准化
    为什么要标准化?如何标准化?内容fit_transform和transform的区别这两个方法都用于对数据进行转换,但它们的适用场景和作用略有不同。1.fit_transform()作用:对数据执行拟合(fit)和转换(transform)操作。用法:用于训练数据,计算均值和标准差等统计量,并基于这些统计量对数据进行转......
  • UEC++中的GetClass和StaticClass函数
    GetClass()用途:GetClass() 是 UObject 类的一个实例方法,用于获取调用它的对象的类信息。返回类型:返回 UClass*,即指向调用对象的类的 UClass 对象的指针。使用场景:当你有一个 UObject 或其子类的实例,并且想要获取这个实例所属类的信息时,你会使用 GetClass()。例......
  • UEC++ UClass类
    一、UClass的定义与功能UClass是虚幻引擎中实现反射机制的关键部分,它允许引擎在运行时动态地查询和操作类的信息。每个UClass都保留了一个称作“类默认对象(ClassDefaultObject,简称CDO)”的模板对象,这个对象由类的构造函数生成,并且之后不会被修改。UClass和CDO都可以为特定对......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......
  • 【C++】string 类模拟实现:深入探索字符串操作原理
     快来参与讨论......