【发布时间】:2020-10-13 18:16:52
【问题描述】:
我正在使用 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;
}
我想保证随机数序列(以及因此生成的随机字符串)在相同架构的不同机器上是相同的,这应该是the answers to this question的情况。
但是,当我重建二进制文件(不更改任何依赖项或库)时,相同种子的随机数序列会发生变化(与先前使用相同种子生成的序列相比)。
如何在同一机器架构+映像 (x86_64 Linux) 上跨不同二进制文件从给定种子生成有保证的随机数序列?
【问题讨论】:
-
你是说 generator 在你的平台上返回不同的数字吗?
-
在同一个二进制文件上,机器A和B上的序列是相同的。但是当我在机器A上重建二进制文件并更新它时,A和B生成的序列是不同的。
-
我知道你现在在说什么。你对发电机的要求太高了。 MT 需要 19937 位“状态”,而您提供的种子只提供 64 位。有很多关于如何正确播种 MT19937 的资料 - 恐怕答案超出了我的薪酬等级。
-
这里有一些有用的东西。尽管一些被赞成的答案很糟糕:stackoverflow.com/questions/45069219/…
标签: c++ random deterministic mersenne-twister