当前位置: 首页 > 知识库问答 >
问题:

在C++中从给定的种子生成相同的随机数序列

水铭晨
2023-03-14
std::string StringUtils::randstring(size_t length, uint64_t seed) {
    static auto& chrs = "abcdefghijklmnopqrstuvwxyz";

    thread_local static std::mt19937 rg(seed);
    thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);

    std::string s;
    s.reserve(length);

    while(length--) {
        s += chrs[pick(rg)];
    }

    return s;
}

我如何在同一机器架构+映像(x86_64 Linux)上,从给定的种子跨不同的二进制生成一个保证的随机数序列?

共有1个答案

牟波
2023-03-14

如果您关心可复制的“随机”数字,那么您应该避免使用C++发行版,包括uniform_int_distribute,而是依赖自己的方法将mt19937中的随机数转换为所需的数字。(例如,我给出了对均匀整数这样做的方法。注意,当重复性很重要时,还有其他事情要考虑。)

C++分布类,如uniform_int_distribute没有标准实现。因此,可以在C++标准库的不同实现中以不同的方式实现这些分发类。注意,并不是“编译器”、“操作系统”或“体系结构”决定使用哪种算法。另见本题。

另一方面,像MT19937这样的随机引擎确实有保证的实现;它们将为所有兼容的C++库实现(包括不同“架构”的实现)中的相同种子返回相同的随机数。

 类似资料:
  • 在我的计算机上卸载并重新安装C编译器 在我的计算机上安装和使用其他C编译器 使用相同的编译器在他人的计算机上运行该程序? 用不同的编译器(可能还有不同的操作系统)在其他人的计算机上运行程序? 还是仅仅是所有C编译器使用相同的RNG算法,所以伪随机序列(从一开始)对每个人都是一样的问题?

  • 当使用相同的种子(例如12345)时,是否有任何选项可以像Numpy random一样在Java中生成相同的随机数。 在Numpy中,我得到的代码低于输出: 在Java中,我从下面的代码中获得输出: 我在Java中比较了SciKit学习和我自己的库中的一些方法的输出。为了生成相同的输出,我需要像Numpy一样生成相同的随机值(SciKit学习使用Numpy随机值)。

  • 问题内容: 我脑子里有一个大问题: 我可以使用种子数生成随机数: 但是我不明白的是那颗种子的作用。例如,有什么区别 该代码具有以下内容: 问题答案: 当您向one-arg 构造函数 提供特定的硬编码种子时,每次您运行该程序时,将生成的随机数将始终相同。当您需要可预测的随机数源时就需要这样做。 但是,当您不提供种子时,构造函数将根据为您选择一个种子。每次运行程序时,随机数都会不同,因为种子每次都会不

  • 本文向大家介绍C#一遍又一遍地生成相同的随机数序列,包括了C#一遍又一遍地生成相同的随机数序列的使用技巧和注意事项,需要的朋友参考一下 示例 当创建Random具有相同种子的实例时,将生成相同的编号。 输出:            

  • 本文向大家介绍C#生成给定范围内的随机整数,包括了C#生成给定范围内的随机整数的使用技巧和注意事项,需要的朋友参考一下 示例 生成一个介于minValue和之间的随机数maxValue - 1。            

  • stackoverflow社区, 给定数字的数字可以交换。在一个序列中,同一个数字只能使用一次(例如20和02、15和51,它们只能在一个序列中使用一次)好吧,我尝试了几个代码组合,但没有一个成功。。。