本页内容

QRandomGenerator Class

QRandomGenerator 类允许用户从一个高质量的随机数生成器中获取随机值。更多内容...

头文件: #include <QRandomGenerator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
由以下接口继承:

QRandomGenerator64

注意:本类中的所有函数均为可重入函数。

注:以下函数还具有线程安全性:

公共类型

公共函数

QRandomGenerator(quint32 seedValue = 1)
QRandomGenerator(const quint32 (&seedBuffer)[N])
QRandomGenerator(std::seed_seq &sseq)
QRandomGenerator(const quint32 *begin, const quint32 *end)
QRandomGenerator(const quint32 *seedBuffer, qsizetype len)
QRandomGenerator(const QRandomGenerator &other)
~QRandomGenerator()
double bounded(double highest)
int bounded(int highest)
qint64 bounded(qint64 highest)
quint32 bounded(quint32 highest)
quint64 bounded(quint64 highest)
int bounded(int lowest, int highest)
qint64 bounded(int lowest, qint64 highest)
qint64 bounded(qint64 lowest, int highest)
qint64 bounded(qint64 lowest, qint64 highest)
quint32 bounded(quint32 lowest, quint32 highest)
quint64 bounded(quint64 lowest, quint64 highest)
quint64 bounded(quint64 lowest, unsigned int highest)
quint64 bounded(unsigned int lowest, quint64 highest)
void discard(unsigned long long z)
void fillRange(UInt (&buffer)[N])
void fillRange(UInt *buffer, qsizetype count)
quint64 generate64()
quint32 generate()
void generate(ForwardIterator begin, ForwardIterator end)
double generateDouble()
void seed(quint32 seed = 1)
void seed(std::seed_seq &seed)
QRandomGenerator::result_type operator()()

静态公共成员

QRandomGenerator *global()
QRandomGenerator::result_type max()
QRandomGenerator::result_type min()
QRandomGenerator securelySeeded()
QRandomGenerator *system()
bool operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)

详细说明

QRandomGenerator 可用于从高质量的随机数生成器中生成随机值。与 C++ 随机引擎类似,可以通过构造函数使用用户提供的值对 QRandomGenerator 进行初始化。 设置种子后,该类生成的数序是确定性的。也就是说,给定相同的种子数据,QRandomGenerator 将生成相同的数序。但如果种子不同,生成的结果应有显著差异。

QRandomGenerator::securelySeeded() 可用于创建一个通过QRandomGenerator::system() 进行安全初始化的 QRandomGenerator,这意味着其生成的数列无法轻易被预测。 此外,QRandomGenerator::global() 会返回一个 QRandomGenerator 的全局实例,Qt 将确保其以安全方式进行种子初始化。该对象是线程安全的,在大多数情况下可以共享,并且始终由QRandomGenerator::system() 提供种子

QRandomGenerator::system() 用于访问系统的加密安全随机数生成器。在 Unix 系统上,这相当于从/dev/urandom 读取数据,或调用getrandom() 及getentropy() 系统调用。

该类可生成 32 位或 64 位的随机数,或填充此类随机数的数组。生成新值最常见的方式是调用generate()、generate64() 或fillRange() 函数。使用方法如下:

    quint32 value = QRandomGenerator::global()->generate();

此外,它还提供了一个浮点函数generateDouble(),该函数返回一个落在 [0, 1) 范围内的数值(即包含 0 但不包含 1)。还有一组便捷函数,可帮助获取落在有限整数范围内的随机数。

种子和确定性

可以为 QRandomGenerator 提供特定的种子数据。这样做之后,该对象生成的随机数将始终相同,如下例所示:

    QRandomGenerator prng1(1234), prng2(1234);
    Q_ASSERT(prng1.generate() == prng2.generate());
    Q_ASSERT(prng1.generate64() == prng2.generate64());

种子数据的形式为一个或多个 32 位字。理想的种子大小应大致等于 QRandomGenerator 类本身的大小。由于种子数据的混合作用,QRandomGenerator 无法保证不同的种子会生成不同的序列。

QRandomGenerator::global() 与所有由 `QRandomGenerator::securelySeeded()` 创建的生成器一样,其种子始终来自 `QRandomGenerator::system()`,因此无法使其生成完全相同的序列。

批量数据

在确定性模式下运行时,QRandomGenerator 可用于批量数据生成。事实上,对于不需要密码学安全或真随机数据的应用程序,建议使用常规的 QRandomGenerator 而不是QRandomGenerator::system() 来满足其随机数据需求。

为了方便使用,QRandomGenerator 提供了一个全局对象,可以像以下示例中那样轻松使用:

    int x = QRandomGenerator::global()->generate();
    int y = QRandomGenerator::global()->generate();
    int w = QRandomGenerator::global()->bounded(16384);
    int h = QRandomGenerator::global()->bounded(16384);

系统级随机数生成器

QRandomGenerator::system() 可用于访问系统范围的随机数生成器,该生成器在所有运行 Qt 的系统上均具备密码学安全性。此函数将在可用时利用硬件功能生成随机数。 在这些系统上,相关功能属于真正的随机数生成器(RNG)。然而,即使是真正的 RNG,其熵源也是有限的,因此一旦熵池耗尽,可能无法生成任何结果。

若发生这种情况,操作系统会首先尝试,随后 QRandomGenerator 也会依次回退到质量逐渐降低的伪随机数生成器(其中 Qt 的回退生成器最为简单)。这些生成器是否仍具备密码学级质量取决于具体实现。 因此,不应将QRandomGenerator::system() 用于高频随机数生成,以免熵池耗尽。作为经验法则,该类每秒生成的随机数据量不应超过 1 千字节(注:具体数值可能因系统而异)。

如果应用程序需要大量真正的随机数生成器(RNG)数据,应直接使用操作系统提供的功能(例如 Linux 上的/dev/random ),并等待熵资源可用。如果应用程序需要具有密码学级别的伪随机数生成器(PRNG)引擎,但不需要真正的随机性,则仍可使用QRandomGenerator::system()(参见下文)。

如果既不需要真正的随机数生成器,也不需要加密安全的伪随机数生成器(CSPRNG),应用程序应改用 QRandomGenerator 的确定性模式以及 C++ 标准库中的伪随机数生成器。QRandomGenerator::system() 可用于为这些生成器提供种子。

备用质量

QRandomGenerator::system() 利用操作系统机制获取随机数,该机制会尝试从周围环境中收集真实熵以生成真正的随机数。然而,熵池可能耗尽,此时操作系统将暂时回退到使用伪随机引擎。 在任何情况下,QRandomGenerator::system() 都不会阻塞,等待收集更多熵。

以下操作系统保证,即使熵池耗尽,其随机数生成 API 生成的结果质量也至少达到加密安全级别:Apple 操作系统(Darwin)、BSD、Linux、Windows。 除非存在系统安装问题(例如当前进程无法读取/dev/urandom ),否则QRandomGenerator::system() 也将具有相同的保证。

在其他操作系统上,QRandomGenerator 将回退到具有良好数值分布的伪随机数生成器(PRNG),但无法保证在所有情况下都能正确初始化。请查阅操作系统文档以获取更多信息。

对于要求 QRandomGenerator 不得回退到非加密级生成器的应用程序,建议查阅其操作系统文档,或将其部署限制在上述操作系统之一。

从 Qt 6.12 开始,QRandomGenerator 在首次回退到不安全的伪随机数生成器(PRNG)时,会向stderr 输出警告。可在 Qt 构建过程中设置可选功能randomgenerator_disable_fallback ,以禁用不安全的回退机制;若应用程序尝试使用 QRandomGenerator 时 CSPRNG 不可用,则直接终止应用程序。

可重入性与线程安全性

QRandomGenerator 是可重入的,这意味着只要多个线程操作的是不同的对象,它们就可以同时对该类进行操作。如果多个线程需要共享一个 PRNG 序列,则需要通过互斥锁(mutex)进行外部锁定。

例外情况是QRandomGenerator::global()和QRandomGenerator::system()返回的对象:这些对象是线程安全的,任何线程均可直接使用,无需外部锁定。请注意,线程安全性并不适用于这些对象的复制:应始终通过引用使用它们。

标准 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) 范围内的浮点数:

    std::uniform_real_distribution<> dist(1, 2.5);
    return dist(*QRandomGenerator::global());

另请参阅 QRandomGenerator64 。

成员类型文档

QRandomGenerator::result_type

对operator()函数返回类型的typedef定义。即quint32。

另请参阅 operator()。

成员函数文档

QRandomGenerator::QRandomGenerator(quint32 seedValue = 1)

使用值seedValue 作为种子初始化此 QRandomGenerator 对象。使用相同种子值构造或重新初始化的两个对象将生成相同的数列。

另请参阅 seed() 和securelySeeded()。

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

使用数组seedBuffer 中的值作为种子,初始化此QRandomGenerator对象。使用相同种子值构造或重新初始化的两个对象将生成相同的数列。

这是一个重载函数。

另请参阅 seed() 和securelySeeded()。

[noexcept] QRandomGenerator::QRandomGenerator(std::seed_seq &sseq)

使用种子序列sseq 作为种子初始化此QRandomGenerator对象。使用相同种子值构造或重新初始化的两个对象将生成相同的数列。

这是一个重载函数。

另请参阅 seed() 和securelySeeded()。

QRandomGenerator::QRandomGenerator(const quint32 *begin, const quint32 *end)

使用范围为begin 到end 内的值作为种子来初始化此 QRandomGenerator 对象。使用相同种子值构造或重新初始化的两个对象将生成相同的数列。

此构造函数等同于:

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

这是一个重载函数。

另请参阅 seed() 和securelySeeded()。

QRandomGenerator::QRandomGenerator(const quint32 *seedBuffer, qsizetype len)

使用数组seedBuffer 中找到的len 值作为种子来初始化此QRandomGenerator对象。使用相同种子值构建或重新初始化的两个对象将生成相同的数列。

此构造函数等同于:

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

这是一个重载函数。

另请参阅 seed() 和securelySeeded()。

QRandomGenerator::QRandomGenerator(const QRandomGenerator &other)

在other 对象中创建生成器状态的副本。如果other 是QRandomGenerator::system()或其副本,则该对象也将从操作系统的随机数生成机制中读取数据。在这种情况下,这两个对象生成的序列将不同。

在所有其他情况下,新的 QRandomGenerator 对象将在确定性序列中从与other 对象相同的起始位置开始。从该点起,这两个对象将生成相同的序列。

因此,不建议创建QRandomGenerator::global()的副本。如果需要一个完全独立的确定性生成器,请考虑使用securelySeeded()来获取一个与QRandomGenerator::global()没有任何关联的新对象。

[constexpr noexcept default] QRandomGenerator::~QRandomGenerator()

销毁QRandomGenerator 的实例。

double QRandomGenerator::bounded(double highest)

生成一个介于 0(含)与highest (不含)之间的随机双精度数值。该函数等同于以下实现:

    return generateDouble() * highest;

如果highest 参数为负数,结果也将为负数;如果该参数为无穷大或 NaN,结果也将为无穷大或 NaN(即非随机)。

另请参阅 generateDouble() 和bounded(quint64)。

int QRandomGenerator::bounded(int highest)

生成一个位于 0(含)至highest (不含)范围内的 32 位随机数。highest 必须为正数。

请注意,此函数无法用于获取 int 类型完整的 32 位范围内的值。此时,请使用generate() 并将其强制转换为 int。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

qint64 QRandomGenerator::bounded(qint64 highest)

生成一个随机 64 位数值,其范围在 0(包含)到highest (不包含)之间。highest 必须为正数。

请注意,此函数无法用于获取qint64 这一完整64位范围内的值。此时,请使用generate64()并将其强制转换为qint64类型,或者改用该函数的无符号版本。

注意:此 函数以循环方式实现,其运行次数取决于获得的随机值。从长远来看,平均循环次数应略少于 2 次,但如果随机数生成器存在缺陷,此函数的执行时间可能会显著延长。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

quint32 QRandomGenerator::bounded(quint32 highest)

生成一个随机 32 位数值,其取值范围在 0(含)到highest (不含)之间。也可以通过使用 std::uniform_int_distribution 并设置参数 0 和highest - 1 也能得到相同的结果。该类还可用于生成大于 32 位的数值;若需 64 位数值,也可使用 64 位的 bounded() 重载方法。

例如,要获得介于 0 和 255(含)之间的值,应这样写:

    quint32 v = QRandomGenerator::global()->bounded(256);

当然,也可以通过对generate() 的返回结果进行掩码,仅保留低 8 位来获得相同结果。这两种方法的效率相当。

请注意,该函数无法用于获取 quint32 的完整 32 位范围内的值。此时应使用generate()。

这是一个重载函数。

另请参见 generate()、generate64() 和generateDouble()。

quint64 QRandomGenerator::bounded(quint64 highest)

生成一个取值范围在 0(包含)到highest (不包含)之间的 64 位随机数。也可以通过使用 std::uniform_int_distribution<quint64> 并指定参数 0 和highest - 1 也可得到相同结果。

请注意,此函数无法用于获取quint64 的完整64位范围内的值。如需获取该范围内的值,请使用generate64()。

注意:该 函数以循环形式实现,其运行次数取决于生成的随机值。从长期来看,平均循环次数应略少于 2 次,但如果随机数生成器存在缺陷,该函数的执行时间可能会显著延长。

这是一个重载函数。

另请参阅 generate()、generate64() 以及generateDouble()。

int QRandomGenerator::bounded(int lowest, int highest)

生成一个随机 32 位数值,其取值范围在lowest (包含该值)和highest (不包含该值)之间;这两个值均可为负数,但highest 必须大于lowest 。

请注意,此函数无法用于获取 int 类型完整 32 位范围内的值。若需获取该范围内的值,请使用generate() 并将其强制转换为 int 类型。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

qint64 QRandomGenerator::bounded(int lowest, qint64 highest)

qint64 QRandomGenerator::bounded(qint64 lowest, int highest)

quint64 QRandomGenerator::bounded(quint64 lowest, unsigned int highest)

quint64 QRandomGenerator::bounded(unsigned int lowest, quint64 highest)

该函数的作用是在参数类型不完全匹配时,协助进行重载解析。它会将较小的类型提升为较大类型的类型,并调用正确的重载。

qint64 QRandomGenerator::bounded(qint64 lowest, qint64 highest)

生成一个随机 64 位数值,其取值范围在lowest (含)到highest (不含)之间,这两个数值都可能是负数,但highest 必须大于lowest 。

请注意,此函数无法用于获取qint64 的完整 64 位范围内的值。请改用generate64() 并将其强制转换为 qint64。

注意:该 函数以循环方式实现,其运行次数取决于获得的随机值。从长远来看,平均循环次数应略少于 2 次,但如果随机数生成器存在缺陷,该函数的执行时间可能会显著延长。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

quint32 QRandomGenerator::bounded(quint32 lowest, quint32 highest)

生成一个随机 32 位数值,其取值范围在lowest (包含该值)到highest (不包含该值)之间。highest 参数必须大于lowest 。

也可以通过使用 std::uniform_int_distribution 并设置参数lowest 和\a highest - 1 也可获得相同结果。该类还可用于生成大于 32 位的数值。

例如,要获取介于 1000(含)和 2000(不含)之间的值,应编写如下代码:

    quint32 v = QRandomGenerator::global()->bounded(1000, 2000);

请注意,此函数无法用于获取 quint32 的完整 32 位范围内的值。此时应使用generate()。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

quint64 QRandomGenerator::bounded(quint64 lowest, quint64 highest)

生成一个随机 64 位数值,其取值范围在lowest (包含)与highest (不包含)之间。参数highest 必须大于lowest 。

也可以通过使用 std::uniform_int_distribution<quint64> 并使用参数lowest 和\a highest - 1 也可获得相同结果。

请注意,此函数无法用于获取quint64 的完整 64 位范围内的值。此时应使用generate64()。

注意:该 函数以循环形式实现,其运行次数取决于生成的随机值。从长期来看,平均循环次数应略少于 2 次,但如果随机数生成器存在缺陷,该函数的执行时间可能会显著延长。

这是一个重载函数。

另请参阅 generate()、generate64() 和generateDouble()。

void QRandomGenerator::discard(unsigned long long z)

从序列中移除接下来的z 个条目。该方法等同于调用generate()z 次并丢弃结果,如下所示:

    while (z--)
        generator.generate();

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

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

例如,要生成两个32位数值,可以这样编写:

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

当然,也可以先调用一次generate64(),然后将64位值的两半拆分出来。

另请参阅 generate()。

template <typename UInt, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt *buffer, qsizetype count)

生成count 个32位或64位随机数(具体取决于类型UInt ),并将它们存储在buffer 所指向的缓冲区中。这是同时获取多个随机数的最有效方法,因为它减少了调用随机数生成器源代码的次数。

例如,要将一个包含 16 个条目的列表填充为随机值,可以这样编写:

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

另请参阅 generate()。

quint64 QRandomGenerator::generate64()

生成一个 64 位随机数并返回该数值。

另请参阅 operator()() 和generate()。

quint32 QRandomGenerator::generate()

生成一个 32 位随机数并返回该数值。

另请参阅 operator()() 和generate64()。

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

生成 32 位量,并将它们存储在begin 到end 之间的范围内。该函数等同于(且实现为):

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

该函数符合函数 std::seed_seq::generate的要求,该函数要求无符号 32 位整数值。

请注意,如果 [begin, end) 范围指向的区域每个元素可存储超过 32 位的数据,这些元素仍将仅初始化为 32 位数据。其余位将设为零。若要用 64 位量填充该范围,可编写如下代码:

    std::generate(begin, end, []() { return QRandomGenerator::global()->generate64(); });

如果该范围指向连续的内存(例如数组或QList 中的数据),也可以使用fillRange()函数。

另请参阅 fillRange()。

double QRandomGenerator::generateDouble()

生成一个位于规范区间 [0, 1)(即包含 0,不包含 1)内的随机 qreal 值。

该函数等同于:

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

也可以通过使用 std::uniform_real_distribution 并传入参数 0 和 1 也能得到相同的结果。

另请参阅 generate()、generate64(),以及bounded()。

[static] QRandomGenerator *QRandomGenerator::global()

返回指向一个共享QRandomGenerator 的指针,该对象已使用securelySeeded()进行初始化。应使用此函数来生成随机数据,从而避免为特定用途创建开销较大的、经过安全初始化的QRandomGenerator ,也无需存储体积较大的QRandomGenerator 对象。

例如,以下代码生成一个随机的 RGB 颜色:

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

对该对象的访问是线程安全的,因此无需加锁即可在任何线程中使用。该对象还可以被复制,复制后生成的序列将与共享对象生成的序列相同。但请注意,如果其他线程正在访问该全局对象,这些线程获取样本的时间间隔可能是不可预测的。

注意:此函数是线程安全的。

另请参阅 securelySeeded() 和system()。

[static constexpr] QRandomGenerator::result_type QRandomGenerator::max()

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

另请参阅 min()。

[static constexpr] QRandomGenerator::result_type QRandomGenerator::min()

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

另请参阅 max()。

[static] QRandomGenerator QRandomGenerator::securelySeeded()

返回一个通过QRandomGenerator::system() 安全初始化的新QRandomGenerator 对象。该函数将获取QRandomGenerator 所用算法的理想种子大小,因此是创建将长期保留的新QRandomGenerator 对象的推荐方法。

鉴于为确定性引擎安全初始化所需的數據量较大,该函数的执行成本较高,因此不应用于QRandomGenerator 的短期用途(若用于生成少于2600字节的随机数据,实际上是浪费资源)。 如果使用场景不需要那么多的数据,请考虑使用QRandomGenerator::global() 函数,并避免存储QRandomGenerator 对象。

另请参阅 global() 和system()。

void QRandomGenerator::seed(quint32 seed = 1)

使用值seed 作为种子,重新初始化此对象。

[noexcept] void QRandomGenerator::seed(std::seed_seq &seed)

使用种子序列seed 作为种子,对该对象进行重新初始化。

这是一个重载函数。

[static] QRandomGenerator *QRandomGenerator::system()

返回指向共享QRandomGenerator 的指针,该随机数生成器始终使用操作系统提供的功能来生成随机数。在以下操作系统上,这些系统功能被认为在密码学上是安全的:Apple操作系统(Darwin)、BSD、Linux、Windows。在其他操作系统上可能也是如此。

此外,这些随机数生成机制可能由真正的硬件随机数生成器提供支持。因此,不应将本函数返回的QRandomGenerator 用于批量数据生成。相反,应将其用于为QRandomGenerator 或<random>头文件中的随机引擎提供种子。

该函数返回的对象是线程安全的,可在任何线程中无锁使用。该对象也可被复制,生成的QRandomGenerator 同样会调用操作系统功能,但生成的随机数序列将不相同。

注意:此函数是线程安全的。

另请参阅 securelySeeded() 和global()。

QRandomGenerator::result_type QRandomGenerator::operator()()

生成一个 32 位随机数并返回该数值。

另请参阅 generate() 和generate64()。

相关的非成员函数

bool operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)

如果两个引擎rng1 和rng2 处于不同状态,或者其中一个正在从操作系统接口读取数据而另一个没有,则返回 `true `;否则返回 `false `。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.