首页 > 其他分享 >Qt 随机数生成器:QRandomGenerator

Qt 随机数生成器:QRandomGenerator

时间:2024-02-28 11:26:16浏览次数:30  
标签:std Qt 生成器 quint32 QRandomGenerator bounded highest seed

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

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

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

  QRandomGenerator 还与均匀分布类 std::uniform_int_distribution 和 std: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);

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 中。这是一次获取多个数量的最有效方法,因为它减少了对随机数生成器源的调用次数。X`

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 位随机数。

 

标签:std,Qt,生成器,quint32,QRandomGenerator,bounded,highest,seed
From: https://www.cnblogs.com/ybqjymy/p/18039383

相关文章

  • Qt 生成随机数 qrand、QRandomGenerator
    //老方法//利用qrand和qsrand生成随机数//位于QtGlobal中//例,生成一个0和10之间的随机数1qsrand(QTime::currentTime().msec());//设置种子,该种子作为qrand生成随机数的起始值,RAND_MAX为32767,即随机数在种子值到32767之间2qrand()%10;//新方法//利用QRandomGenerator类......
  • Qt 无法连接到进程内QML调试器
    问题:由于在Qt5以上版本默认开启QML调试器造成的。用于告知用户,这将打开一个到运行QML的Javascript解释器的端口,以便从中获得调试输出。显然,这会造成一个安全漏洞,所以在不安全的地方使用时应该关闭它(在释放运行时自动关闭)。Qt4默认不开启QML调试器,而Qt5版本以上默认开启。......
  • Qt QList使用总结
    概述QList是Qt的泛型容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问以及基于索引的插入和删除。QList、QLinkedList和QVector提供了类似的API和功能。它们通常是可互换的,但性能有所区别。QVector应该是默认首选的容器QList是最广泛用于QtAPI中传递值......
  • Qt QVector和vector以及QMap和map的遍历性能对比
    使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。测试环境:系统:windows10编译器:MingGWmingw......
  • Qt 开发经验常见问题及优化100条
    01:001-010当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。比如我们可能就写错了一行代码,编译提示几百个错误,你只要把这一行纠正了,其他错误也就没了。定时器是个好东西,学会好使......
  • Qt QList的用法
    在Qt中,QList 是一个常用的容器类,用于存储元素的动态数组。以下是简单的QList用法:1、包含头文件在使用QList之前,确保包含相应的头文件。#include<QList>2、创建QList对象使用QList模板创建一个对象,并指定存储的数据类型。QList<int>myList;//创建一个......
  • Qt QString的isEmpty与isNull区别
    1.isEmpty()如果字符串没有字符,则返回true;否则返回false。1QString().isEmpty();//returnstrue2QString("").isEmpty();//returnstrue3QString("ABC").isEmpty();//returnsfalse2.isNull如果字符串是无效的,则返回true;否则返回false。1QString().is......
  • Qt QVector、QList、QSet和QMap:性能与用途比较
    Qt提供了多种容器类,用于存储和管理数据。其中,QVector、QList、QSet和QMap是最常用的几种。这些容器类在性能和用途方面存在一些差异,选择合适的容器对于提高应用程序的效率和正确性至关重要。下面我们将从以下几个方面对这四种容器进行比较:1.存储方式QVector:动态数组,元素在......
  • Qt 常见数据结构详解:从基本框架到实际应用
    在Qt框架中,数据结构的选择对于提高代码效率和性能至关重要。正确地使用数据结构可以显著提高应用程序的效率和响应速度。下面我们将详细介绍Qt中常见的几种数据结构,包括QString、QList、QVector、QMap、QHash、QSet和QPair。1.QStringQString是Qt中用于处理字符串的类。......
  • Qt 编写的qml程序全屏时,挡住系统虚拟键盘的解决办法
    官方有提到该问题。尤其是使用qml时,一定会出现这个遮挡问题。https://doc.qt.io/qt-5/windows-issues.html 默认的qml工程的解决代码如下:1...2#include<QWindow>3#include<QtPlatformHeaders/QWindowsWindowFunctions>4...56intmain(intargc,char*arg......