关于C++中的随机数生成器

今天需要生成随机序列来测试代码,记录一下C++中随机数生成器的使用方法。
C++中使用random库生成随机数,主要使用两个类:

  1. 随机数引擎类
    调用这个类会生成一个调用运算符。
    该运算符不接受任何参数,并返回一个随机的unsigned整数。
    常与随机数分布类共同使用,很少单独使用。
  2. 随机数分布类
    需要以随机数引擎作为参数(即必须先定义随机数引擎类)。
    常用方法:
    uniform_int_distribution :指定范围的随机非负数
    uniform_real_distribution:指定范围的随机实数
    bernoulli_distribution :指定概率的随机布尔值

具体使用方法:

首先调用default_random_engine,生成一个random engine.

//首先生成一个random-number engine, 每次调用会返回一个unsigned int类型的数。cout << "Generate a random engine" << endl;default_random_engine e;for (int i = 0; i < 10; i++) {cout << e() << endl;}

运行结果:

再生成随机分布类

先生成一个uniform_int_distribution类,
模板参数为要生成的随机数类型(int, unsigned int, short, unsigned short, long, unsigned long, long long, unsigned long long);
构造函数接受两个参数,表示生成随机数的范围。
调用时要以random engine为参数。

cout << "generate uniform_int_distribution" << endl;uniform_int_distribution<int> dis(0, 9);for (int i = 0; i < 10; i++) {// 注意这里是dis(e), 而不是dis(e()),函数接受的参数是random engine。cout << dis(e) << endl; }

运行结果:

uniform_real_distribution使用方法同上,只是生成的是实数。(float, double, long double)

cout << "generate uniform_real_distribution" << endl;uniform_real_distribution<float> dis2(0, 9);for (int i = 0; i < 10; i++) {cout << dis2(e) << endl;}

运行结果:

bernoulli_distribution不是模板类,它的构造函数只有一个参数,为该类返回true的概率,默认为0.5。
该函数也需要接受random engine参数。

cout << "generate bernoulli_distribution" << endl;bernoulli_distribution dis3;for (int i = 0; i < 10; i++) {cout << dis3(e) << endl;}

运行结果:

设置seed

可以通过为random engine设置随机数种子(seed)来控制生成随机数的序列。若不设置seed,则random engine使用默认种子。两个使用默认种子的engine生成的序列是相同的。
seed可以在构造函数中给定,也可以在之后设置。

default_random_engine e1;      //使用默认种子
default_random_engine e2(100); //给定seed=100
default_random_engine e3;      //使用默认种子
default_random_engine e4(200); //给定seed=200
cout << "e1: " << e1() << " e2: " << e2() << " e3: " << e3() << " e4: " << e4() << endl;
cout << "e1()==e3(): " << (e1() == e3()) << endl;

运行结果:

下面设置e3和e4的seed=100

e3.seed(100);
e4.seed(100);
for (int i = 0; i < 5; i++) {cout << "e2: " << e2() << " e3: " << e3() <<" e4: "<< e4() << endl;
}

运行结果:

从结果中可以观察到:
e3生成的序列与e2相同,由于e2之前已经生成了一个数,e3生成的序列始终落后e2一个数。
由于e3和e4同时设置seed,二者生成的序列相同。
因此可以理解为:每次设置seed后random engine根据seed重新生成序列。

将系统时间设为seed

随机数发生器并不是完全随机的,每次运行程序都会返回相同的数值序列。
这对调试非常友好,但是实际运行时希望每次取得不同的随机序列。
通常将系统时间设为seed,使得每次运行的seed不同

default_random_engine e5(time(0));

楼猪是个菜鸡,欢迎共同交流共同进步。

关于C++中的随机数生成器相关推荐

  1. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...

  2. 随机数生成器 java_Java中的随机数生成器

    随机数生成器 java Today we will look at how to generate a random number in Java. Sometimes we need to gene ...

  3. 随机数生成器python_Python中的随机数生成器

    随机数生成器python We can use Python random module to generate random numbers. We can use this module to g ...

  4. C语言中的随机数生成器

    在我们编写程序的时候,经常会需要电脑给我们随机生成一个整数,这个时候我们就需要一个随机数的生成器--rand().rand()为C语言中的函数,调用该函数需要加头文件#include<stdli ...

  5. Python中的随机数生成器模块(真/伪随机数)

    真随机数发生器(TRNG) 真随机数发生器会生成几乎无法预测的随机数,因为影响结果值变化的因素是物理环境的特征.例如,掷骰子将生成难以预测的随机值.但是骰子的数量限制为1到6.因此,几乎很难预测生成随 ...

  6. Java中Math3 各种随机数生成器的使用(Random Generator)

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 背景 python中numpy生成随机数 产生 ...

  7. C++11中随机数生成器(random)

    目录 1 随机数生成器的分类 2 随机数据引擎 2.1 线性同余法引擎 2.2 梅森旋转法引擎 2.3 滞后Fibonacci引擎 2.4 非确定随机生成器 2.5 默认随机数引擎 3 随机数适配器 ...

  8. Java 中Random类随机数生成器

    *随机数生成器Random类  *   * public Random()产生一个随机数生成器  * public Random(long seed):创建随机数生成器的同时,给固定时间值  *    ...

  9. 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

    原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器                本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...

  10. 如何在Ruby中获得随机数

    如何生成0到n之间的随机数? #1楼 那这个呢? n = 3 (0..n).to_a.sample #2楼 如果您不仅要查找数字,而且要查找十六进制或uuid,则值得一提的是, SecureRando ...

最新文章

  1. 在线CSS工具及相关资源收集
  2. OpenStack Skyline 现代化的管理界面
  3. Nginx+Tomcat+memcached负载均衡实现seccion存储
  4. 变种 背包问题_【朝夕的ACM笔记】动态规划-背包问题
  5. Java根据学号提取班级_学生成绩管理系统 1. 能够实现根据以下关键字查询:学生姓名 、学号、班级、课 联合开发网 - pudn.com...
  6. List和DataTable的Limit
  7. Linux学习之FTP服务
  8. 南京财经大学计算机专业读研,计算机考研报录比比较的院校:南京财经大学
  9. UEFI 引导与 BIOS 引导
  10. android u盘自动挂载点,Android2.3实现SD卡与U盘自动挂载的方法
  11. JQuery插件,轻量级表单模型验证
  12. 崩溃!还未修复的 Bug,凌晨三点遭到黑客 DDoS 攻击 | 技术头条
  13. Mysql添加用户错误:ERROR 1364 (HY000): Field ‘ssl_cipher‘ doesn‘t have a default value解决方法
  14. 服务器系统建立安全连接失败,尝试与系统“ServerName”建立安全连接时,MSDTC遇到错误(HR = 0x80000171)...
  15. 使用PYTHON采集船舶MMSI数据
  16. java 多线程库_Java多线程设计模式(7)线程独有储藏库模式
  17. 计算机英语背诵发音,英语26个字母的标准发音 26个字母背诵顺口溜
  18. 如何拆笔记本--键盘拆卸
  19. 不可不知的潮流文化、新词汇, 00后聊天词汇
  20. 中止执行后超过2年_申请执行超过2年时效,法院还处理吗?

热门文章

  1. error: warning: Stopped in a context claiming to capture an Objective-C object pointer,
  2. 树莓派linux下载机,树莓派打造北邮人种子下载机——下载、做种一条龙全站式教程...
  3. 解决局域网文件传输慢的问题
  4. 强强联合丨谱尼测试与北大医疗鲁中医院开启战略合作新征程
  5. 【泛型,数据结构,List接口,Set接口】
  6. unity 3d实例:创建游戏对象、旋转的立方体、Unity3D Button、图片按钮、Box控件、Label控件、Background Color、Color
  7. linux bin目录在哪,Linux 基础知识 /bin,/sbin,/usr/sbin,/usr/bin 目录 区别详解
  8. Golang学习日志 ━━ Gin-Vue-Admin按步骤手动创建api及router、service
  9. 全球及中国毫米波人体安检仪行业竞争格局分析与投资战略规划研究报告2022-2028年
  10. 谷歌的天敌竟然是亚马逊:从开放7-Mic阵列授权说起