gpt4 book ai didi

c++ - 我可以从 Mersenne Twister 获得当前种子吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:05 26 4
gpt4 key购买 nike

我正在我的应用程序中调整 Mersenne Twister,特别是来自 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.htmlmt19937ar.c - 代码反射(reflect)在 https://gist.github.com/mstum/8367363

这在游戏中用作确定性 RNG,并且为了使保存游戏按预期工作,我需要从 MT 中获取当前种子(而不是初始种子),以便我可以继续。

例如,假设我用 12345 的种子初始化它并调用 genrand_int31 5 次。这会产生序列 1996335345、1911592690、679411342、280691776、394962642

现在,假设我在第三个数字 (679411342) 后保存了游戏,然后重新加载并获得两个随机数。我希望这些数字成为序列的下两个数字 (280691776, 394962642),为此我需要知道第三次迭代后的种子。

作为一种解决方法,我有初始种子和调用 RNG 的次数,因此现在加载游戏会使用初始种子启动 MT 并“重播”genrand_int31 但是成百上千次 - 这有点愚蠢 :)

我尝试简单地使用 mt[N] 数组的第一个元素,但这确实行不通。不幸的是,我对 Mersenne Twister 背后的数学理解不够充分,无法弄清楚它到底是怎么回事。

最佳答案

这两个是MT生成器的状态,你可以保存这些然后恢复:

static unsigned long mt[N]; /* the array for the state vector  */
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */

也许您需要修改C中的原始源代码。

我也不相信存在任何这样的种子可以等同于 MT 的任意状态:种子本身包含 64 位,最多 2 ^64个可能的值,远远少于MT所能拥有的状态(周期为2^19937-1)

EIDTED:

As a Workaround, I have the initial seed and the number of times I called into the RNG, so loading a game right now spins up the MT with the initial seed and "replays" genrand_int31 however many hundreds or thousands of times - which is kinda stupid :)

嗯,这还不算太蠢。 :) 告诉你,在MT的数学背后,你可以恢复它连续一段时间输出的内部状态,准确的数字是624——你只需要保存中最近的624个数字genrand_int32。我正在寻找这方面的任何现有 Material 。

再次编辑:

Cracking Random Number Generators - Part 3展示了如何使用 MT 生成器的一些(少至 624)输出数字来推断其内部状态。这并不完全出乎意料,因为 MT 是为强大的统计随机性而设计的,而不是像加密那样的安全性。
但是,我认为在这种情况下,解决问题的最简单方法是将您自己的代码添加到 MT 生成器中以保存/恢复其内部状态。

关于c++ - 我可以从 Mersenne Twister 获得当前种子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21058775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com