c++11随机数生成_随机数怎么产生

c++11随机数生成_随机数怎么产生这是 C++11 新特性介绍的第十部分,涉及到随机数库相关的新特性。

前九篇在这里:
C++11新特性之新类型与初始化: blog.guoyb.com/2016/06/18/…
C++11新特性之类型推断与类型获取: blog.guoyb.com/2016/06/25/…
C++11新特性之lambda: blog.guoyb.com/2016/06/30/…
C++11新特性之容器相关特性: blog.guoyb.com/2016/07/09/…
C++11新特性之智能指针: blog.guoyb.com/2016/08/02/…
C++11新特性之Class: blog.guoyb.com/2016/08/14/…
C++11新特性之右值引用与移动: blog.guoyb.com/2016/08/20/…
C++11新特性之template: blog.guoyb.com/2016/08/31/…
C++11新特性之正则表达式: blog.guoyb.com/2016/09/10/…

这是C++11新特性介绍的第十部分,涉及到随机数库相关的新特性。
不想看toy code的读者可以直接拉到文章最后看这部分的总结。

简介

之前,C++中的随机数生成都依赖于一个简单的rand函数。这个函数产生一定范围内的一个均匀随机整数。如果需要其他随机分布或者其他范围的随机数,就需要根据rand函数产生的随机数进行再加工,不过这时,就容易引入非随机性了。

C++11新标准中引入了一个新的随机数库,相关功能定义在random头文件中,通过多个互相协作的类,可以生成任意范围内、服从多种随机分布的随机数。

随机引擎

新的随机数库中引入了随机引擎的概念。一个随机引擎将产生一组原始的随机数列,一般这些原始的随机数不能直接使用,要配合随机分布类产生符合某分布的随机数后才能进行使用。

一般,最常用的随机引擎是default_random_engine。

std::cout<<"test default random engine:\n";
std::default_random_engine e;
e.seed(time(0));
for(size_t i = 0; i < 10; i++)
  std::cout<

随机分布

可以用uniform_int_distribution和随机引擎配合来产生均匀分布的随机整数

std::cout<<"test random distribution:\n";
e.seed(time(0));
std::uniform_int_distribution u(0, 9);
for(size_t i = 0; i < 10; i++)
  std::cout<

类似的,uniform_real_distribution则可以产生一个均匀分布的实数

std::cout<<"test real distribution:\n";
e.seed(time(0));
std::uniform_real_distribution u2(0, 1);
for(size_t i = 0; i < 10; i++)
  std::cout<

换一个分布,试试正态分布:

std::cout<<"test normal distribution:\n";
e.seed(time(0));
std::normal_distribution<> n(4, 1.5);
std::vector vals(9);
for(size_t i = 0; i < 250; i++)
{
  unsigned v = lround(n(e));
  if(v < vals.size()) vals[v]++;
}

for(size_t i = 0; i < vals.size(); i++)
{
  std::cout<

伯努利分布也是经常会使用到的:

std::cout<<"test bernoulli distribution:\n";
e.seed(time(0));
std::bernoulli_distribution b(0.7);
std::vector bers(2);
for(size_t i = 0; i < 200; i++)
{
  if(b(e)) bers[1]++;
  else bers[0]++;
}
std::cout<<"True: "<

输出

整个测试程序的输出结果如下:

test default random engine:
1446291605      455604842       1571377939      395129967       929918845       1907528696      51427609        1055398369      2012947210      146383632
test default random engine done.

test random distribution:
6       2       7       1       4       8       0       4       9       0
test random distribution done.

test real distribution:
0.212158        0.183997        0.888262        0.491458        0.0681652       0.173643        0.128234        0.954471        0.891836        0.912416
test real distribution done.

test normal distribution:
0: ** 1: ******** 2: ******************************
3: ************************************************* 4: *****************************************************************
5: ******************************************************* 6: ***************************** 7: ********* 8: * test normal distribution done. test bernoulli distribution: True: 132 False: 68 test bernoulli distribution done.

总结

  1. C++11新标准中引入了比rand更强大的随机数库。
  2. 随机数引擎和随机分布类配合,共同产生符合某一分布、在某一范围内的随机数。

完整代码详见random.cpp

转载请注明出处: blog.guoyb.com/2016/09/12/…

欢迎使用微信扫描下方二维码,关注我的微信公众号TechTalking,技术·生活·思考:
后端技术小黑屋

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13679.html

(0)

相关推荐

  • 如何运行Python代码?

    如何运行Python代码? Python是一种高级编程语言,可用于开发各种类型的应用程序,包括网站和应用程序。本文将介绍如何运行Python代码,包括如何保存和运行Python程序文件,获得用户界面以及在虚拟机和VS Code中运行Python代码。

    2024-08-06
    40
  • PostgreSQL通过oracle_fdw访问Oracle数据「建议收藏」

    PostgreSQL通过oracle_fdw访问Oracle数据「建议收藏」背景: 同一个项目两个系统分别使用了PG库和Oracle库,Oracle是生产库,数据动态更新,现在在PG库中需要实时的获取到更新的数据进行统计,基于此种方式,可以通过ETL的工具实现,但是需要定期进

    2023-04-15
    148
  • Python实现JSON转字符串

    Python实现JSON转字符串在日常软件开发过程中,我们时常需要将数据从一种格式转换为另一种格式。JSON是一种简洁、清晰的数据格式,被广泛用于Web开发和移动应用开发中。在Python中,有很多方法可以实现JSON转换,同时也支持将JSON转换为字符串。在本文中,我们将介绍如何使用Python实现JSON转字符串。

    2024-06-07
    60
  • Python编程之解析Python的内涵

    Python编程之解析Python的内涵Python是一门面向对象的编程语言。面向对象编程(OOP)是一种编程范式,它将数据和方法封装在由对象构成的单元中。Python中一切都是对象,包括类和函数都是对象。对象有自己的属性和方法,并能通过对象调用其属性和方法。Python中的类定义方式是使用class关键字:

    2024-02-29
    87
  • sql 对表进行聚合查询的方法_MySQL两张表联合查询SQL语句

    sql 对表进行聚合查询的方法_MySQL两张表联合查询SQL语句学习重点 使用聚合函数对表中的列进行计算合计值或者平均值等的汇总操作。 通常,聚合函数会对 NULL 以外的对象进行汇总。但是只有 COUNT 函数例外,使用 COUNT(*) 可以查出包含 NULL

    2023-04-28
    145
  • 利用Python进行链接建设优化

    利用Python进行链接建设优化链接建设优化(Link Building)是指通过外部链接提高网站的搜索引擎排名,是搜索引擎优化的重要组成部分。与传统领域不同,互联网领域的链接建设优化更加注重质量而非数量,因此如何高效地进行链接建设优化成为了每个网站优化人员关注的重点。本文将介绍如何使用Python进行链接建设优化。

    2024-04-02
    71
  • 深入剖析线程同步工具CountDownLatch原理「终于解决」

    深入剖析线程同步工具CountDownLatch原理「终于解决」CountDownLatch作为一个多线程间的同步工具,它允许一个或多个线程等待其他线程(可以是多个)完成工作后,再恢复执行。 我们直接拿源码中给出的Demo看一下,源码中的这个demo可以看做模拟一个赛跑的场景。 赛跑肯定有跑得快的运动员也有跑的慢的运动员,每个运动员就表示一…

    2023-07-15
    118
  • TIDB在win10安装_mongodb和hadoop

    TIDB在win10安装_mongodb和hadoop写在前面的话 技术选型是由技术方向和业务场景 trade-off 决定的,脱离业务场景来说技术选型是没有任何意义的,所以本文只是阐述了伴鱼技术团队数据库选型的过程,这并不是 MySQL、MongoDB

    2023-04-03
    150

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注