📜  如何在 C++ 中使用 mersenne_twister_engine 生成随机数 - C++ (1)

📅  最后修改于: 2023-12-03 14:52:15.070000             🧑  作者: Mango

如何在 C++ 中使用 mersenne_twister_engine 生成随机数

在 C++ 中, mersenne_twister_engine 是 C++11 标准库中提供的随机数生成器,它使用了梅森旋转算法(Mersenne Twister Algorithm)来生成高质量的随机数序列。本文将介绍如何在 C++ 中使用 mersenne_twister_engine 生成随机数。

生成随机数

使用 mersenne_twister_engine 生成随机数的步骤如下:

  1. 包含 <random> 头文件。
  2. 创建一个 mersenne_twister_engine 的实例。
  3. mersenne_twister_engine 实例设置种子。
  4. 生成随机数。

下面是一个使用 mersenne_twister_engine 生成随机数的示例代码:

#include <random>
#include <iostream>

int main()
{
    // 创建一个 mersenne_twister_engine 实例
    std::mt19937 engine;

    // 为引擎设置种子,通常使用现在的时间作为种子
    engine.seed(std::time(nullptr));

    // 使用引擎生成随机数
    std::uniform_int_distribution<int> dist(0, 100);
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(engine) << std::endl;
    }

    return 0;
}

上面的示例代码中,使用 std::mt19937 创建了一个 mersenne_twister_engine 实例,并将当前时间作为种子通过 engine.seed() 方法设置到引擎中。然后,使用 std::uniform_int_distribution 创建了一个均匀分布的随机数生成器 dist,它可以用来生成指定范围内的随机整数。通过 dist(engine) 方法,就可以使用引擎生成随机数。

重置随机数状态

使用 mersenne_twister_engine 生成随机数时,我们通常会通过 engine.seed() 来设置种子,但有时我们可能需要重置随机数状态,即使种子相同,也能够生成一个新的随机数序列。这时,可以使用 engine.discard(n) 方法,将引擎的状态向前推进 n 步,来达到重置随机数状态的目的。

下面是使用 engine.discard(n) 方法重置随机数状态的示例代码:

#include <random>
#include <iostream>

int main()
{
    std::mt19937 engine;
    engine.seed(std::time(nullptr));

    // 生成 10 个随机数
    std::uniform_int_distribution<int> dist(0, 100);
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(engine) << std::endl;
    }
    
    // 重置随机数状态,再生成 10 个随机数
    engine.discard(10);
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(engine) << std::endl;
    }

    return 0;
}

在上面的示例代码中,先使用引擎生成了 10 个随机数,然后调用 engine.discard(10) 重置了引擎的随机数状态,再次使用引擎生成 10 个随机数时,得到的是一个全新的随机数序列。

总结

本文介绍了如何在 C++ 中使用 mersenne_twister_engine 生成随机数。使用 mersenne_twister_engine,可以生成高质量的随机数序列,同时,也提供了重置随机数状态的方法,方便在需要的时候回到随机数序列的起点。