C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个C 库函数 rand 来产生随机数,然而,这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个最大值RAND_MAX(至少为 32767)之间。

  rand 函数存在一些问题:在实际的编程中,很多程序需要不通范围的随机数。一些应用需要随机浮点数。一些程序需要非均匀分布的随机数。所在在编写程序时为了生成满足一定要求的随机数,通常会转换 rand 生成的随机数的范围、类型或者是分布,但是这样会引入非随机性。

c++11提供的<random>实现了随机数库,它通过随机数引擎类(random_number_engines)产生随机数序列,随机数分布类(random_number_distribution)使用随机数引擎生成服从特定概率分布的随机数。

下面介绍一个C++中生成随机数的例子:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
//#include "Timer.h"
#include <random>// const int arraySize = 100000;
int main()
{std::default_random_engine e;    // 默认的随机数引擎for (int i = 0; i < 15; i++){auto rnd = e();std::cout << rnd << std::endl;std::cout << typeid(rnd).name() << std::endl;   // 返回值的类型}std::cout << e.max() << " | " << e.min() << std::endl;   // 随机数引擎的范围//system("pause");return 0;
}

随机数类是定义在std命名空间的,所以要声明。随机数引擎是函数对象,这就是为什么使用e()去生成随机数。程序每次运行都会生成相同的随机数序列,这在一定程度有利于程序的调试,但我们有时需要每一次运行产生的随机数序列都是不同的。我们可以通过设置随机数引擎的种子来改变引擎的状态,没有改变时是使用默认的随机数种子,这就是为什么每一次都生成同样的随机数序列。从结果我们可以知道,默认的种子生成随机数范围在1-2147483646之间。

可以通过e.seed()方法来设置随机数种子:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
//#include "Timer.h"
#include <random>// const int arraySize = 100000;
int main()
{std::default_random_engine e;    // 默认的随机数引擎e.seed(10);    // 设置生成随机数的种子for (int i = 0; i < 15; i++){auto rnd = e();std::cout << rnd << std::endl;//std::cout << typeid(rnd).name() << std::endl;   // 返回值的类型}std::cout << e.max() << " | " << e.min() << std::endl;   // 随机数引擎的范围//system("pause");return 0;
}

如果需要改变生成的随机数的范围,需要使用随机数分布类:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
//#include "Timer.h"
#include <random>// const int arraySize = 100000;
int main()
{std::default_random_engine e;    // 默认的随机数引擎std::uniform_int_distribution<int> u(0, 10);    // 随机数分布类,可以确定随机数范围 [0,10]e.seed(10);    // 设置生成随机数的种子for (int i = 0; i < 15; i++){auto rnd = u(e);std::cout << rnd << "  ";//std::cout << typeid(rnd).name() << std::endl;   // 返回值的类型}std::cout << std::endl;std::cout << e.max() << " | " << e.min() << std::endl;   // 随机数引擎的范围//system("pause");return 0;
}

在实际的应用中,[0, 1]之间的随机数应用的比较广泛,在C++11中,可以按照如下的方式生成满足要求的随机数:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
//#include "Timer.h"
#include <random>// const int arraySize = 100000;
int main()
{std::default_random_engine e;    // 默认的随机数引擎std::uniform_real_distribution<double> u(0, 1);    // 随机数分布类,可以确定随机数范围 [0,10]e.seed(10);    // 设置生成随机数的种子for (int i = 0; i < 15; i++){auto rnd = u(e);std::cout << rnd << "  ";//std::cout << typeid(rnd).name() << std::endl;   // 返回值的类型}std::cout << std::endl;std::cout << e.max() << " | " << e.min() << std::endl;   // 随机数引擎的范围//system("pause");return 0;
}

除此之外,c++11的<random>库还提供了不同的随机数引擎和随机数分布类,例如,要生成满足正态分布的0-1之间的随机数:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include "Timer.h"
#include <random>// const int arraySize = 100000;
int main()
{std::default_random_engine e;    // 默认的随机数引擎// std::normal_distribution的构造函数  可知参数的意义// explicit normal_distribution(_Ty _Mean0 = 0.0, _Ty _Sigma0 = 1.0)  std::normal_distribution<double> u(0, 1);    // 正态分布 e.seed(10);    // 设置生成随机数的种子for (int i = 0; i < 15; i++){auto rnd = u(e);std::cout << rnd << "  ";//std::cout << typeid(rnd).name() << std::endl;   // 返回值的类型}std::cout << std::endl;std::cout << e.max() << " | " << e.min() << std::endl;   // 随机数引擎的范围//system("pause");return 0;
}

C++11 提供的随机数引擎和随机数分布类型如下所示:
http://www.cplusplus.com/reference/random/?kw=random

随机数引擎:

随机数分布类:

------------------------------------------------------------------------------------------------------

C++11 随机数生成相关推荐

  1. C++11新式洗牌std::shuffle与老式洗牌函数std::random_shuffle的区别

    文章目录 前言 洗牌算法 std::random_shuffle rand 和 srand 随机数生成器和分布器 std::shuffle randint 总结 前言 洗牌算法是项目开发中常用的一种算 ...

  2. Numpy基础:数组和矢量计算

    ndarray:多维数组对象 以下内容参考书<利用Python进行数据分析>. numpy 官方的学习文档 https://docs.scipy.org/doc/numpy-dev/use ...

  3. 蒙特卡洛路径跟踪 C++实现 图形学冬学期作业

    蒙特卡洛路径跟踪 原理 蒙特卡洛积分 蒙特卡洛路径跟踪 俄罗斯轮盘赌 改写rendering equation 改进的蒙特卡洛路径跟踪算法 对每个像素发射光线 实现 场景管理 BVH 光线和AABB求 ...

  4. 【小沐学C++】C++11 实现随机数生成(Windows、Linux)

    文章目录 1.简介 2.Windows随机数 2.1 随机数范围计算公式 2.2 rand() 2.3 srand() 2.4 c++11 <random> 2.4.1 随机数生成引擎 2 ...

  5. [转]C++11 随机数学习

    相对于C++ 11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多.这是因为相对于之前的只需srand.rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西. 随机数生成算 ...

  6. 随机数生成算法-二谈

    2019独角兽企业重金招聘Python工程师标准>>> 生成均匀"随机数",一种生成均匀分布数字的简单方法 在实现粒子系统时,希望粒子能均匀分布在某个范围内,很容 ...

  7. java 随机数生成实现_Java中生成随机数的实现方法总结

    搜索热词 在实际开发工作中经常需要用到随机数.如有些系统中创建用户后会给用户一个随机的初始化密码.这个密码由于是随机的,为此往往只有用户自己知道.他们获取了这个随机密码之后,需要马上去系统中更改.这就 ...

  8. UA STAT675 统计计算I 随机数生成7 Envelope Accept-Reject Algorithm

    UA STAT675 统计计算I 随机数生成7 Envelope Accept-Reject Algorithm Squeeze Principle Atkinson's Poisson Simula ...

  9. TensorFlow损失函数(loss function) 2017-08-14 11:32 125人阅读 评论(0) 收藏 举报 分类: 深度学习及TensorFlow实现(10) 版权声明:

    TensorFlow损失函数(loss function) 2017-08-14 11:32 125人阅读 评论(0) 收藏 举报  分类: 深度学习及TensorFlow实现(10)  版权声明:本 ...

最新文章

  1. 在ASP.NET中操作文件的例子
  2. 阿里巴巴400集python教程_阿里巴巴推荐的400集Python视频合集免费学起来,学完万物皆可爬...
  3. 我的程序员之路:上帝的苹果
  4. ubuntu安装npm(npm install)时报错:run `npm audit fix` to fix them, or `npm audit` for details
  5. eureka服务注册yml配置
  6. for循环与while循环效率对比·5年以下编程经验必看C#】
  7. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因
  8. 种树(信息学奥赛一本通-T1423)
  9. 接手一个APP,如何从0到1去做测试体系的搭建?
  10. WordPress采集插件-WordPress文章自动采集发布
  11. 四大行的CIO们如何看待大数据
  12. 基于 Openpose 实现人体动作识别
  13. 《深度学习入门-基于Python的理论与实现》第七章带读 -- CNN介绍
  14. 英雄联盟自定义局怎么和其他服务器的玩家玩,英雄联盟自定义为什么没有玩家进来...
  15. [高项]定性风险分析VS定量风险分析
  16. css平行四边形与菱形变换
  17. 敏捷成熟度评估模型-AMM评估管理实践与技术实践
  18. 流程表结构设计第二版
  19. awg线径与电流_AWG_线径电流
  20. Comet OJ CCPC-Wannafly Winter Camp Day8 A Aqours

热门文章

  1. IOS工作笔记003---windows给VmWare虚拟机OS系统安装xcode
  2. 架构部署001---双机集群(HA)系统
  3. JAVA组件使用---UUID使用方法
  4. Dangling meta character '?' near index 0
  5. C/C++遍历Windows文件夹下的所有文件
  6. Fragment学习笔记
  7. 随想录(windows静态库和动态库)
  8. java this.val$_[Java教程]Jquery $(this).attr和$(this).val用法示例
  9. 数字钟实验报告stm32_单片机-电子时钟实验报告
  10. .ssh文件夹在哪里_【TOOLS】本地利用ssh远程连接服务器并启用远程服务器的jupyter lab并配置好anaconda的环境...