C++ Boost Random随机函数详解

目录
  • 一、说明
  • 二、示例代码

一、说明

Boost.Random 库提供了许多随机数生成器,可让您决定应如何生成随机数。在 C++ 中,始终可以使用来自 cstdlib 的 std::rand() 生成随机数。但是,使用 std::rand() 生成随机数的方式取决于标准库的实现方式。

当包含头文件 boost/random.hpp 时,您可以使用 Boost.Random 中的所有随机数生成器和其他类和函数。

该库的大部分已添加到 C++11 的标准库中。如果您的开发环境支持 C++11,您可以通过包含头文件 random 并访问命名空间 std 来重写本章中的 Boost.Random 示例。

二、示例代码

示例 60.1。带有 boost::random::mt19937 的伪随机数

#include <boost/random.hpp>
#include <iostream>
#include <ctime>
#include <cstdint>
int main()
{
  std::time_t now = std::time(0);
  boost::random::mt19937 gen{static_cast<std::uint32_t>(now)};
  std::cout << gen() << '\n';
}

Example 60.1

示例 60.1 访问随机数生成器 boost::random::mt19937。运算符 operator() 生成一个随机数,并将其写入标准输出。

boost::random::mt19937 生成的随机数是整数。生成整数还是浮点数取决于您使用的特定生成器。所有随机数生成器都定义类型 result_type 以确定随机数的类型。 boost::random::mt19937 的 result_type 是 boost::uint32_t。

所有随机数生成器都提供两个成员函数:min() 和 max()。这些函数返回该随机数生成器可以生成的最小和最大数字。

Boost.Random 提供的几乎所有随机数生成器都是伪随机数生成器。伪随机数生成器不会生成真正的随机数。它们基于生成看似随机数的算法。 boost::random::mt19937 是这些伪随机数生成器之一。
伪随机数生成器通常必须进行初始化。如果它们用相同的值初始化,它们将返回相同的随机数。这就是为什么在示例 60.1 中,std::time() 的返回值被传递给 boost::random::mt19937 的构造函数。这应该保证当程序在不同的时间运行时,会产生不同的随机数。

伪随机数对于大多数用例来说已经足够好了。 std::rand() 也基于伪随机数生成器,它必须用 std::srand() 初始化。不过Boost.Random提供了一个随机数生成器,可以生成真正的随机数,只要操作系统有生成真正随机数的源即可。

示例 60.2。带有 boost::random::random_device 的实随机数

#include <boost/random/random_device.hpp>
#include <iostream>
int main()
{
  boost::random::random_device gen;
  std::cout << gen() << '\n';
}

boost::random::random_device is a non-deterministic random number generator,这是一个随机数生成器,可以产生真正的随机数。没有需要初始化的算法。因此,预测随机数是不可能的。非确定性随机数生成器通常用于与安全相关的应用程序。

boost::random::random_device 调用操作系统函数来生成随机数。如果像示例 60.2 一样调用默认构造函数,则 boost::random::random_device 在 Windows 上使用加密服务提供程序 MS_DEF_PROV,在 Linux 上使用 /dev/urandom 作为源。

如果您想使用其他来源,请调用 boost::random::random_device 的构造函数,它需要一个 std::string 类型的参数。如何解释此参数取决于操作系统。在 Windows 上,它必须是加密服务提供商的名称,在 Linux 上,它必须是设备的路径。

请注意,如果您想使用 boost::random::random_device 类,则必须包含 boost/random/random_device.hpp。 boost/random.hpp 不提供此类。

示例 60.3。具有 bernoulli_distribution 的随机数 0 和 1

#include <boost/random.hpp>
#include <iostream>
#include <ctime>
#include <cstdint>
int main()
{
  std::time_t now = std::time(0);
  boost::random::mt19937 gen{static_cast<std::uint32_t>(now)};
  boost::random::bernoulli_distribution<> dist;
  std::cout << dist(gen) << '\n';
}

Example 60.3

示例 60.3 使用伪随机数生成器 boost::random::mt19937。此外,还使用了分布。分布是 Boost.Random 类,它将随机数范围从随机数生成器映射到另一个范围。虽然像 boost::random::mt19937 这样的随机数生成器具有内置的随机数下限和上限,可以使用 min() 和 max() 查看,但您可能需要不同范围内的随机数。

示例 60.3 模拟投掷硬币。因为硬币只有两个面,随机数生成器应该返回 0 或 1。boost::random::bernoulli_distribution 是一个返回两个可能结果之一的分布。

分布的使用类似于随机数生成器:您调用运算符 operator() 来接收随机数。但是,您必须将随机数生成器作为参数传递给分布。在示例 60.3 中,dist 使用随机数生成器 gen 返回 0 或 1。

示例 60.4。 1 到 100 之间的随机数,具有 uniform_int_distribution

#include <boost/random.hpp>
#include <iostream>
#include <ctime>
#include <cstdint>
int main()
{
  std::time_t now = std::time(0);
  boost::random::mt19937 gen{static_cast<std::uint32_t>(now)};
  boost::random::uniform_int_distribution<> dist{1, 100};
  std::cout << dist(gen) << '\n';
}

Boost.Random 提供了多种分布。示例 60.4 使用了经常需要的分布:boost::random::uniform_int_distribution。此分布可让您定义所需的随机数范围。在示例 60.4 中,dist 返回 1 到 100 之间的一个数字。

请注意,dist 可以返回值 1 和 100。分布的下限和上限都包括在内。

除了 boost::random::bernoulli_distribution 和 boost::random::uniform_int_distribution 之外,Boost.Random 中还有许多分布。例如,boost::random::normal_distribution 和 boost::random::chi_squared_distribution 等分布用于统计。

到此这篇关于C++ Boost Random随机函数详解的文章就介绍到这了,更多相关C++ Boost Random内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost Accumulators累加器详细讲解

    Boost.Accumulators Boost.Accumulators 提供了处理样本的类.例如,您可以找到最大或最小的样本,或者计算所有样本的总和.虽然标准库支持其中一些操作,但 Boost.Accumulators 还支持统计计算,例如均值和标准差. 该库称为 Boost.Accumulators,因为累加器是一个基本概念.累加器是一个容器,每次插入一个值时都会计算出一个新的结果.该值不一定存储在累加器中.相反,累加器在输入新值时不断更新中间结果. Boost.Accumulators

  • C++ Boost ProgramOptions超详细讲解

    目录 一.说明 二.示例Boost.ProgramOptions 一.说明 Boost.ProgramOptions Boost.ProgramOptions 是一个可以轻松解析命令行选项的库,例如,控制台应用程序.如果您使用图形用户界面开发应用程序,命令行选项通常并不重要. 要使用 Boost.ProgramOptions 解析命令行选项,需要以下三个步骤: 定义命令行选项.您给它们命名并指定哪些可以设置为一个值.如果命令行选项被解析为键/值对,您还可以设置值的类型——例如,它是字符串还是数字

  • C++ Boost System超详细讲解

    目录 一.说明 二.关于 Boost.System库 一.说明 以下库支持错误处理. Boost.System 提供类来描述和识别错误.自 C++11 以来,这些类已成为标准库的一部分. Boost.Exception 使得在抛出异常后附加数据成为可能. 二.关于 Boost.System库 Boost.System Boost.System 是一个库,本质上定义了四个类来识别错误.所有四个类都已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,则无需使用 Boost.Syste

  • C++ Boost.Signals2信号/槽概念

    目录 一.关于Boost.Signals2 二.关于Signals库 练习 一.关于Boost.Signals2 Boost.Signals2 实现了信号/槽的概念.一个或多个函数(称为槽)与可以发出信号的对象相关联.每次发出信号时,都会调用链接的函数. 信号/槽概念在开发具有图形用户界面的应用程序时非常有用.可以对按钮进行建模,以便在用户单击它们时发出信号.它们可以支持指向许多函数的链接以处理用户输入.这样就可以灵活地处理事件. std::function 也可用于事件处理. std::fun

  • C++ Boost Flyweight库使用介绍

    目录 一.说明 二.库Boost.Flyweight 炼习 一.说明 以下库用于设计模式. Boost.Flyweight 有助于在程序中使用许多相同的对象并且需要减少内存消耗的情况. Boost.Signals2 使得使用观察者设计模式变得容易.这个库被称为 Boost.Signals2 因为它实现了信号/槽的概念. Boost.MetaStateMachine 使得将状态机从 UML 转移到 C++ 成为可能. 本节内容 66. Boost.Flyweight 67. Boost.Signa

  • C++ Boost log日志库超详细讲解

    目录 一.说明 二.库Boost.Log 一.说明 应用程序库是指通常专门用于独立应用程序开发而不用于库开发的库. Boost.Log 是一个日志库. Boost.ProgramOptions 是一个用于定义和解析命令行选项的库. Boost.Serialization 允许您序列化对象,例如,将它们保存到文件或从文件加载它们. Boost.Uuid 支持使用 UUID. 具体内容 62. Boost.Log 63. Boost.ProgramOptions 64. Boost.Serializ

  • C++ Boost Uuid超详细讲解

    目录 一.说明 二.Boost.Uuid库示例和代码 一.说明 Boost.Uuid 为 UUID 提供生成器. UUID 是不依赖于中央协调实例的通用唯一标识符.例如,没有数据库存储所有生成的 UUID,可以检查这些 UUID 是否使用了新的 UUID. UUID 由必须唯一标识组件的分布式系统使用.例如,Microsoft 使用 UUID 来识别 COM 世界中的接口.对于为 COM 开发的新接口,可以轻松分配唯一标识符. UUID 是 128 位数字.存在多种生成 UUID 的方法.例如,

  • C++ Boost Archive超详细讲解

    目录 一.说明 二.关于Archive库 一.说明 对Boost.Serialization库的应用,存在如下内容: Archive Pointers and References Serialization of Class Hierarchy Objects Wrapper Functions for Optimization Boost.Serialization 库可以将 C++ 程序中的对象转换为可以保存和加载以恢复对象的字节序列.有不同的数据格式可用于定义生成字节序列的规则. Boo

  • C++ Boost Random随机函数详解

    目录 一.说明 二.示例代码 一.说明 Boost.Random 库提供了许多随机数生成器,可让您决定应如何生成随机数.在 C++ 中,始终可以使用来自 cstdlib 的 std::rand() 生成随机数.但是,使用 std::rand() 生成随机数的方式取决于标准库的实现方式. 当包含头文件 boost/random.hpp 时,您可以使用 Boost.Random 中的所有随机数生成器和其他类和函数. 该库的大部分已添加到 C++11 的标准库中.如果您的开发环境支持 C++11,您可

  • python中random随机函数详解

    目录 一.random基础 二.实数分布 2.1 对称分布 2.2 指数分布 2.3 Beta 分布 2.4 Gamma 分布 2.5 高斯分布 2.6 对数正态分布 2.7 正态分布 2.8 冯·米塞斯分布 2.9 帕累托分布 2.10 威布尔分布 总结 加载相关库 import random import seaborn as sns import matplotlib.pyplot as plt # 解决中文不显示的问题 from pylab import mpl mpl.rcParams

  • python中random模块详解

    Python中的random模块用于生成随机数,它提供了很多函数.常用函数总结如下: 1. random.random() 用于生成一个0到1的随机浮点数: 0 <= n < 1.0 2. random.seed(n) 用于设定种子值,其中的n可以是任意数字.random.random() 生成随机数时,每一次生成的数都是随机的.但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个. 3. random.unifo

  • C++ Boost Lambda表达式详解

    目录 lambda表达式格式 说明Boost.Lambda lambda表达式格式 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表.返回值类型是可选的,捕捉列表.函数体可以为空. 先来看一个较为简单的lamda表达式 int main(void) { auto add = [](int a, int b)->int {return a + b; }; cout << add(1, 2) << endl; r

  • javascript中Math.random()使用详解

    Math.random()方法返回大于等于 0 小于 1 的一个随机数.对于某些站点来说,这个方法非常实用,因为可以利用它来随机显示一些名人名言和新闻事件. 1. 在连续整数中取得一个随机数 值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值) 例:产生1-10的随机数 复制代码 代码如下: var rand1 = Math.floor(Math.random() * 10 + 1); 编写产生startNumber至endNumber随机数的函数 复

  • C#学习笔记- 随机函数Random()的用法详解

    Random.Next() 返回非负随机数: Random.Next(Int) 返回一个小于所指定最大值的非负随机数 Random.Next(Int,Int) 返回一个指定范围内的随机数,例如(-100,0)返回负数 1.random(number)函数介绍 见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表一个整数. 示例: trace(random(5)); 2.Math.random() 见帮助文档.返回一个有14位精度的

  • Python中的随机函数random详解

    目录 常规用法 使用案例: 常规用法 用法 作用 random() 返回0<=n<1之间的随机浮点数n random.uniform(a, b) 用于生成一个指定范围内的随机符点数 random.randint(a, b) 用于生成一个指定范围内的整数 random.randrange([start], stop[, step]) 从指定范围内,按指定基数递增的集合中 获取一个随机数 choice(seq) 从序列seq中返回随机的元素 shuffle(seq[, random]) 原地指定s

  • C# Random类随机函数实例详解

    目录 引言 一.创建界面 二.效果展示 三.Random类方法 四.代码逻辑 总结: 引言 Random类是非常值得学习的一个类,所以我们今天一起学习一下Random这个类,对于模拟数据这个是随机类可是一个好东西,我们可以用这个随机函数模拟我们想要的数据,从而实现数据模拟,为了更好的学习随机数Random,我们做一个随机挑选饭菜的随机选择器,为了更好的学习,创作不易,点赞关注评论收藏!!!你的点赞是我学习的动力,你点赞是我创作的方向. 一.创建界面 我们平时有选择恐惧症的,每天的人生难题就是今天

  • C基础 寻找随机函数的G点详解

    引言 随机函数算法应该是计算机史上最重要的十大算法之一吧. 而C中使用的随机函数 #include <stdlib.h> _Check_return_ _ACRTIMP int __cdecl rand(void); 本文主要围绕rand 函数找到G点. 就是伪随机函数的周期值. 关于rand 源码, 可以从Linux底层源码 glibc中找.  看了一下大约4个文件. 算法比较复杂. 感觉很稳定. 这里不探讨随机算法的实现. 只为了找到 随机函数周期. 前言 现在window上测试. 测试代

  • 有关C++中随机函数rand() 和srand() 的用法详解

    一.rand() 函数名:   rand 功   能:   随机数发生器 用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned int 双字节是65535,四字节是4294967295的整数范围.0~RAND

随机推荐