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

让我们看一个简单的例子:

#include <iostream>
#include <random>

using std::cout; using std::endl;
using std::default_random_engine;

int main()
{
    default_random_engine e;
    for (size_t i = 0; i < 10; ++i) //生成十个随机数
       cout << e() << endl;
    cout << "Min random:" << e.min() << endl; //输出该随机数引擎序列的范围
    cout << "Max random:" << e.max() << endl;
    return 0;
}

生成的随机数结果:

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

#include <iostream>
#include <random>using std::cout; using std::endl;
using std::default_random_engine;int main()
{default_random_engine e; //或者直接在这里改变种子 e(10) e.seed(10); //设置新的种子for (size_t i = 0; i < 10; ++i)cout << e() << endl;cout << "Min random:" << e.min() << endl;cout << "Max random:" << e.max() << endl;return 0;
}

设置新的种子后结果如下:

在结果可以看出,生成随机数序列不同了。在这里范围还是一样的,那么怎么去改变生成的范围呢?这时就可以使用随机数分布类了。

#include <iostream>
#include <random>using std::cout; using std::endl;
using std::default_random_engine;
using std::uniform_int_distribution;int main()
{default_random_engine e; uniform_int_distribution<unsigned> u(0, 9); //随机数分布对象 for (size_t i = 0; i < 10; ++i)  //生成范围为0-9的随机数序列 cout << u(e) << " ";cout << endl;return 0;
}

结果如下:

这里要注意的这个序列也是每次运行程序相同的,因为分布对象将随机数引擎作为它的参数,分布对象使用它的引擎参数生成随机数,并将其映射到指定的分布。

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

现在,让我更深入一点吧,在图形上很多时候都要使用0.0-1.0的值(颜色)作为数据,那么怎么生成这样的序列呢?跟刚才那样,我们可以使用分布区定义范围。

#include <iostream>
#include <random>using std::cout; using std::endl;
using std::default_random_engine;
using std::uniform_real_distribution;int main()
{default_random_engine e; uniform_real_distribution<double> u(0, 1); //随机数分布对象 for (size_t i = 0; i < 5; ++i)  //生成范围为0.0-1.0的随机数序列 cout << u(e) << " ";cout << endl;return 0;
}

结果:

在这里分布类改变了类型,采用的是real实数类型的分布类,实例化为<double>,生成0.0-1.0的double随机数序列。如果你想要获得分布类范围的端点,只要简单的成员函数min()和max()就可以了。

随机数的重要性质是随机分布,但是我们也可以生产非均匀分布的随机数序列。

下面的例子生成符合正态分布的随机数序列:

#include <iostream>
#include <random>
#include <vector>
#include <string>using std::cout; using std::endl;
using std::default_random_engine;
using std::normal_distribution;
using std::vector; using std::string;int main()
{default_random_engine e; vector<unsigned> vals(9);normal_distribution<> n(4, 1.5); //正态分布,大部分生成的随机数落在0-8之间 for (size_t i = 0; i != 200; ++i)  {  unsigned v = lround(n(e)); //舍入到最近整数 if (v < vals.size())++vals[v];        //统计0-8数字出现的次数
    }for (decltype(vals.size()) i = 0; i != vals.size(); ++i) cout << i << ": " << string(vals[i], '#') << endl;return 0;
}

结果:

更多资料可看:C++Primer 5th

或者 :http://www.cplusplus.com/reference/random/?kw=random

转载于:https://www.cnblogs.com/byhj/p/4149467.html

c++11 随机数random相关推荐

  1. java生成随机数random_Java获取随机数Random

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  2. Python编程基础:第二十八节 随机数Random Numbers

    第二十八节 随机数Random Numbers 前言 实践 前言 我们在编程过程中有时候需要用到随机数,例如模拟掷骰子,模拟抽签等等.Python为我们提供了random包帮助我们生成随机数. 实践 ...

  3. python随机数生成验证码_Python随机数random模块学习,并实现生成6位验证码

    一.前言 学习python随机数random模块的使用 ,并使用模块中的函数,实现6位验证码生成 二.random模块 1.random.random() 返回0-1直接的随机数,类型为float & ...

  4. vb.net产生随机数Random代码实例

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 随机数Dim a As Rand ...

  5. JAVA猜数字小游戏(随机数Random类)

    快乐JAVA,通过不断的摸索,从C到PHP再到Python,Python再到Java-终于被我找到了属于我的本命编程语言(泪目).学起来很开心,很快乐,这种感觉就像和初恋谈恋爱一样,编程不再是写代码, ...

  6. python随机密码生成以整数17为随机数种子_Python 随机数 random

    1. Python seed() 函数 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数. seed( )是不能直接访问的,需要导入 random 模块,然后通过 r ...

  7. python生成随机数random.randint()随机取值的概率

    python生成随机数random.randint() 1.random.randint(参数1,参数2) 参数1.参数2必须是整数 函数返回参数1和参数2之间的任意整数 2.random.unifo ...

  8. python随机数random_Python 随机数 random

    1. Python seed() 函数 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数. seed( )是不能直接访问的,需要导入 random 模块,然后通过 r ...

  9. C++11生成随机数(random库)

    c++ 中的随机数   在 C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个简单的 C 库函数 rand 来生成随机数,但是,这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和 ...

最新文章

  1. 80后,从爱情,到婚姻
  2. postgresql 排序索引
  3. 文献记录(part41)--Residual multi-task learning for facial landmark localization and expression ...
  4. 136. 只出现一次的数字 golang
  5. android安全补丁卸载,这种安全更新能不卸载就不卸载
  6. STM32工作笔记002---STM32初探-概述
  7. 微软AI实力秀:调侃Google吹牛;免费AI课程上线
  8. 数字化方法基础_常用函数
  9. PHP_变量什么情况下加大括号{}
  10. 如果你不会扒谱,来吧,这款软件给你超能力
  11. kali linux捉肉鸡教程,使用Kali中的Metasploit生成木马控制Windows系统
  12. Vibe算法简介、优缺点、代码
  13. TTL与CMOS电路
  14. html三级下拉栏插件,纯js超酷下拉框插件tastySelect
  15. 数据结构试卷及答案(九)
  16. c语言中指针几个字节,【C++】一个指针占几个字节?为什么呢?
  17. java 实现matlab spline_关于MATLAB中spline函数
  18. 安卓虚拟机_安卓虚拟机Pro解锁付费版 自带root权限 可运行xp等框架
  19. ioswebview混编_iOS 原生和H5混合开发总结
  20. 我的2018:自由职业的冰火两重天

热门文章

  1. 递归--递推之组合数
  2. jsp网页实现登录用户名于密码的验证(不涉及数据库操作)
  3. centos7开启tcp6_centos中docker映射出来的端口被tcp6监听,而没有被tcp监听导致ip+端口无法进行访问...
  4. Metatdata分析
  5. (54)Xilinx双沿原语-IDDR与ODDR(第11天)
  6. (29)VHDL实现时钟分频
  7. STM32F103:一.(4)JWAG功能IO复用
  8. STM32 IAP升级工具
  9. Python中的split()函数
  10. STM32 USART通信