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



我正在使用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;
}

我想保证随机数序列(以及生成的随机字符串(在相同架构的不同机器上是相同的,根据这个问题的答案

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

如何从给定种子生成有保证的随机数序列,跨同一计算机体系结构+映像(x86_64 Linux(上的不同二进制文件?

如果你关心的是可重现的"随机"数,你应该避免C++分布,包括uniform_int_distribution,而是依靠你自己的方式将伪随机数从mt19937转换为你想要的数字。(例如,我给出了对统一整数执行此操作的方法。请注意,当重现性很重要时,还有其他事项需要考虑。

C++发行版类,如uniform_int_distribution,没有标准的实现。因此,这些分发类可以在C++标准库的不同实现中以不同的方式实现。请注意,决定使用哪种算法的不是"编译器"、"操作系统"或"体系结构"。另请参阅此问题。

另一方面,像mt19937这样的随机引擎确实有一个有保证的实现;它们将在所有兼容的C++库实现(包括不同"架构"的实现(中为同一种子返回相同的伪随机数。例外情况是default_random_engine.

最新更新