C++ std::mt19937 类

17 Mar 2025 | 4 分钟阅读

在本文中,您将学习 C++ 中 std::mt19937 类的语法、参数和示例。

在 C 语言中,我们使用 rand()srand() 等函数,而在 C++ 中,我们使用 std::rand()std::srand()。为了符合现代 C++ 标准,有更多高级的随机数生成器可用。其中有 32 位 Mersenne Twister std::mt19937 和 64 位 Mersenne Twister std::mt19937_64,由 Matsumoto 和 Nishimura 分别于 1998 年和 2000 年开发。

标准 ::MT19937(C++11 起)类定义在随机头文件中,是一个非常高效的伪随机数生成器。它使用知名且广泛使用的 Mersenne Twister 方法生成 32 位伪随机数。std::mersenne_twister_engine 类本质上是 std::mt19937 类的一个子集。

std::mt19937 随机数生成器显示在 C++17 标准及更高版本的标题中。它使用 Mersenne Twister 算法生成伪随机数,状态大小为 19937 位,位长为 32。因此,它被称为 mt19937,64 位版本的名称为 mt19937_64。两者都显示为 mersenne_twister_engine 的示例。

语法

这里,mt1mt19937 类的一个实例,以及获取整个序列所需的种子值。

名称 mt19937 的重要性

2^19937 - 1,或 mt19937,长期以来有一个名为 Mersenne Twister 的计算机程序,它生成一个 32 位数字序列,在生成 2^19937 - 1 之前不会重复。

rand() & srand() 与 mt19937 的比较

Std::mt19937 完成两件事。

  • 实例化一个 std::mt19937 对象,类似于 srand(),需要一个参数来生成种子值。
  • 它使用 operator() 生成一个随机数(类似于 rand())。

程序

让我们举一个例子来说明 C++ 中的 std::mt19937 类。

输出

Std::mt19937 class in C++

为什么不使用 rand() 而要使用 mt19937?

尽管 rand() 函数 对于现实世界中相似的随机数来说完全低效,但它的表现并不好。rand() 生成的随机数重复可以被任何人针对,这相当危险。另一方面,std::mt19937 提供以下优点。

  1. rand() 不同,std::mt19937 也需要大量时间。假设一个系统使用 Mersenne Twister 每秒生成 1,000,000,000 (十亿) 个伪随机数,那么随机序列迭代大约需要 3684 × 10^5985 年。可以合理地假设,没有任何申请者会收到一个数字。
  2. 可以同时启动多个具有不同种子值的随机数生成器。

程序

让我们再举一个例子来说明 C++ 中的 std::mt19937 类。

输出

Std::mt19937 class in C++

说明

它的成员函数与 mersenne_twister_engine 相同,因为它是 std::mersenne_twister_engine 类的一个副本。以下是一些最重要的成员函数列表。

1. (构造函数):构造 mt19937。获取一个种子序列对象(类似于 srand() 函数)或种子类型的种子值。

程序

输出

Std::mt19937 class in C++

2. min():返回零,这是 operator() 可以返回的最小值。

程序

让我们再举一个例子来说明在 C++ 中使用 min() 函数的 std::mt19937 类。

输出

Std::mt19937 class in C++

3. max():它返回 operator() 可以返回的最大值 (2^32 - 1 = 4294967295)。

程序

让我们再举一个例子来说明在 C++ 中使用 max() 函数std::mt19937 类。

输出

Std::mt19937 class in C++

4. seed():此函数通过种子序列对象或结果类型的种子值进一步修改对象的种子值。

程序

让我们再举一个例子来说明在 C++ 中使用 seed() 函数的 std::mt19937 类。

输出

Std::mt19937 class in C++

5. operator():它生成伪随机整数(类似于函数 rand())。

程序

让我们再举一个例子来说明在 C++ 中使用 operator()std::mt19937 类。

输出

Std::mt19937 class in C++