当前位置:   article > 正文

Qt随机数生成器:QRandomGenerator

qrandomgenerator

一、描述

QRandomGenerator 可用于从高质量随机数生成器生成随机值。与 C++ 随机引擎一样,QRandomGenerator 可以通过构造函数使用用户提供的值作为种子。播种时,此类生成的数字序列是确定性的。也就是说,给定相同的种子数据,QRandomGenerator 会生成相同的数字序列。给定不同的种子,结果则会不同。

1.1、标准 C++ 库兼容性

QRandomGenerator 是根据 C++ 标准库中对随机数引擎的要求建模的,并且可以在标准库引擎可以使用的几乎所有上下文中使用。要求的例外情况如下:

  • QRandomGenerator 不支持从 std::seed_seq 本身之外的另一个类似种子序列的类播种;
  • QRandomGenerator 不可比较(但可复制)或可流式传输到 std::ostream 或来自 std::istream

QRandomGenerator 还与均匀分布std::uniform_int_distributionstd:uniform_real_distribution 以及自由函数 std::generate_canonical 兼容。 例如,以下代码可用于生成 [1, 2.5) 范围内的浮点数:

  1. std::uniform_real_distribution dist(1, 2.5);
  2. return dist(*QRandomGenerator::global());

二、成员函数

1、QRandomGenerator(const quint32 *begin, const quint32 *end)

使用在从begin到end的范围内找到的值作为种子初始化此 QRandomGenerator 对象。

等价于:

  1. std::seed_seq sseq(begin, end);
  2. QRandomGenerator generator(sseq);

      QRandomGenerator(std::seed_seq &sseq)

使用种子序列 sseq 作为种子初始化此 QRandomGenerator 对象。

      QRandomGenerator(const quint32 *seedBuffer, qsizetype len)

使用在数组 seedBuffer 中找到的 len 值作为种子初始化此 QRandomGenerator 对象。

等价于:

  1. std::seed_seq sseq(seedBuffer, seedBuffer + len);
  2. QRandomGenerator generator(sseq);

      template <qsizetype N> QRandomGenerator(const quint32 (&)[N] seedBuffer = N)

使用在数组 seedBuffer 中找到的值作为种子初始化此 QRandomGenerator 对象。

      QRandomGenerator(quint32 seedValue = 1)

使用值 seedValue 作为种子初始化此 QRandomGenerator 对象。

2、double bounded(double highest)

     quint32 bounded(quint32 highest)

     int bounded(int highest)

     quint64 bounded(quint64 highest)

     qint64 bounded(qint64 highest)

在 0(包括)和最高(不包括)之间的范围内生成一个随机数。

      quint32 bounded(quint32 lowest, quint32 highest)

      int bounded(int lowest, int highest)

在lowest(包括)和highest(不包括)之间的范围内生成一个随机 32 位数量。highest必须大于lowest。

      qint64 bounded(int lowest, qint64 highest)

      qint64 bounded(qint64 lowest, int highest)

      quint64 bounded(quint64 lowest, unsigned int highest)

      quint64 bounded(unsigned int lowest, quint64 highest)

      quint64 bounded(quint64 lowest, quint64 highest)

      qint64 bounded(qint64 lowest, qint64 highest)

当参数的类型不完全匹配时,指向函数的存在有助于解决重载问题。他们会将较小的类型提升为较大的类型并调用正确的重载。

3、template <typename UInt, IfValidUInt<UInt>> void fillRange(UInt *buffer, qsizetype count)

生成 count 32 位或 64 位数量(取决于 UInt 类型)并将它们存储在 buffer 中。这是一次获取多个数量的最有效方法,因为它减少了对随机数生成器源的调用次数。

  1. QList<quint32> list;
  2. list.resize(16);
  3. QRandomGenerator::global()->fillRange(list.data(), list.size());

      template <typename UInt, size_t N, IfValidUInt<UInt>> void fillRange(UInt (&)[N] buffer = N)

生成 N 个 32 位或 64 位数量(取决于 UInt 类型)并将它们存储在 buffer 数组中。这是一次获取多个数量的最有效方法,因为它减少了对随机数生成器源的调用次数。

  1. quint32 array[2];
  2. QRandomGenerator::global()->fillRange(array);

4、quint64 generate64() / quint32 generate()

生成一个 64 位 / 32位随机数并返回。

      template <typename ForwardIterator> void generate(ForwardIterator begin, ForwardIterator end)

生成 32 位随机数并将它们存储在 begin 和 end 之间的范围内。等效于:

    std::generate(begin, end, [this]() { return generate(); });

5、double generateDouble()

在规范范围 [0, 1) 中生成一个随机 qreal。

等价于:

  1. QRandomGenerator64 rd;
  2. return std::generate_canonical<qreal, std::numeric_limits<qreal>::digits>(rd);

6、【static】QRandomGenerator * global()

返回指向使用secureSeeded() 播种的共享QRandomGenerator 的指针。该函数用于创建随机数据而无需为特定用途昂贵地创建安全种子 QRandomGenerator 或存储相当大的 QRandomGenerator 对象。

对该对象的访问是线程安全的,因此可以在任何没有锁的线程中使用。该对象也可以被复制,并且复制产生的序列将与共享对象产生的序列相同。

例如,创建随机 RGB 颜色:

    return QColor::fromRgb(QRandomGenerator::global()->generate());

7、【static】QRandomGenerator::result_type max()

返回 QRandomGenerator 可能生成的最大值。即 std::numeric_limits<result_type>::max()。

      【static】QRandomGenerator::result_type min()

返回 QRandomGenerator 可能生成的最小值。即0。

8、【static】QRandomGenerator securelySeeded()

返回使用 QRandomGenerator::system() 安全播种的新 QRandomGenerator 对象。 此函数将为 QRandomGenerator 使用的算法获得理想的种子大小。

考虑到安全地播种确定性引擎所需的数据量,这个函数有点昂贵,不应该用于 QRandomGenerator 的短期使用。 如果仅需要少量数据,应该考虑使用 QRandomGenerator::global()。

9、void seed(quint32 seed = 1) / void seed(std::seed_seq &seed)

重新设置此对象的种子。

10、QRandomGenerator * system()

返回一个指向共享的 QRandomGenerator 的指针,它总是使用操作系统提供的工具来生成随机数。

它们也可能由真正的硬件随机数生成器支持。 因此,此函数返回的 QRandomGenerator 不应用于批量数据生成。

此函数返回的对象是线程安全的,可以在任何没有锁的线程中使用。 它也可以被复制,并且生成的 QRandomGenerator 也将访问操作系统设施,但它们不会生成相同的序列。

11、QRandomGenerator::result_type operator()()

生成一个 32 位随机数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/106878?site
推荐阅读
相关标签
  

闽ICP备14008679号