C++ Boost Random随机函数详解

 更新时间:2022年11月28日 09:46:49   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、说明

        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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现五子棋功能全解析

    C语言实现五子棋功能全解析

    五子棋是经典的棋牌类游戏,很多人都玩过,那么如何用Python实现五子棋呢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言简易通讯录的实现代码

    C语言简易通讯录的实现代码

    这篇文章主要为大家详细介绍了C语言简易通讯录的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Qt编写地图实现省市区域图的示例代码

    Qt编写地图实现省市区域图的示例代码

    本文主要介绍了Qt编写地图实现省市区域图的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C++链表倒序实现方法

    C++链表倒序实现方法

    这篇文章主要介绍了C++链表倒序实现方法,是一个很经典的C++链表操作实例,需要的朋友可以参考下
    2014-08-08
  • C语言常用占位符的使用小结

    C语言常用占位符的使用小结

    占位符是一种用于格式化输出的特殊字符,通常用于 printf() 等输出函数中,本文主要介绍了C语言常用占位符的使用小结,非常具有实用价值,需要的朋友可以参考下
    2023-05-05
  • C++左值与右值,右值引用,移动语义与完美转发详解

    C++左值与右值,右值引用,移动语义与完美转发详解

    这篇文章主要为大家详细介绍了Python实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 基于C++实现BMI身体质量指数计算工具

    基于C++实现BMI身体质量指数计算工具

    BMI(Body Mass Index,身体质量指数),也称为体重指数,是一种常用的衡量成人人体肥胖程度的指标,本文就来用C++编写一个简单的BMI计算工具吧
    2023-10-10
  • C++中关于委派(Delegates)的实现示例

    C++中关于委派(Delegates)的实现示例

    这篇文章主要介绍了C++中关于委派(Delegates)的实现示例,针对C++11的一些新特性进行讲解,需要的朋友可以参考下
    2015-07-07
  • C++11获取线程返回值的实现代码

    C++11获取线程返回值的实现代码

    这篇文章主要介绍了C++11获取线程返回值的实现代码,需要的朋友可以参考下
    2019-04-04
  • C语言中操作进程信号的相关函数使用详解

    C语言中操作进程信号的相关函数使用详解

    这篇文章主要介绍了C语言中操作进程信号的相关函数使用详解,分别是signal()函数和kill()函数的用法,需要的朋友可以参考下
    2015-09-09

最新评论