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

C++ 在C+中生成相同的随机数序列+;从给定的种子,c++,random,deterministic,mersenne-twister,C++,Random,Deterministic,Mersenne Twister,我使用mt19937从给定种子生成一个随机字符串,如下所示: 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::unifor

我使用mt19937从给定种子生成一个随机字符串,如下所示:

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;
}
std::StringUtils::randstring(大小长度,uint64种子){
静态自动&chrs=“abcdefghijklmnopqrstuvxyz”;
线程_本地静态标准::mt19937 rg(种子);
线程本地静态标准::统一内部分布拾取(0,sizeof(chrs)-2);
std::字符串s;
s、 储备(长度);
while(长度--){
s+=chrs[pick(rg)];
}
返回s;
}
我想保证相同体系结构的不同机器上的随机数序列(以及由此生成的随机字符串)是相同的,这应该是根据的情况

但是,当我重新生成二进制文件时(不更改任何依赖项或库),相同种子的随机数序列会发生变化(与使用相同种子的前一次构建生成的序列相比)

如何在同一个机器结构+图像(x8664 64 Linux)下,在给定的种子上生成一个随机序列的保证序列?(

>P)。如果可重复的“随机”数字是您关心的,则应该避免C++分布,包括<代码>一致性ItIn分发< /代码>,而是依靠您自己的方式将随机数从
mt19937
转换为您想要的数字。(例如,我为您提供了一些方法。请注意,当再现性很重要时,会有一些方法。)

C++分布类,例如
统一分布
。因此,在C++标准库的不同实现中,这些分布类可以不同地实现。请注意,决定使用哪种算法的不是“编译器”、“操作系统”或“体系结构”。另见


另一方面,像mt19937这样的随机引擎确实有保证的实现;它们将返回相同的随机数,用于所有兼容的C++库实现(包括不同的架构)。机器A和B上的序列是相同的。但是当我在机器A上重建二进制文件并更新它时,A和B生成的序列是不同的。我知道你现在在说什么。你对发电机要求太高了。MT需要19937位的“状态”,而您提供的种子只提供其中的64位。关于如何正确播种MT19937,有很多东西在那里——恐怕答案超出了我的工资等级。这里有一些有用的东西。尽管有些被高估的答案很糟糕:这能回答你的问题吗?