- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在我的应用程序中调整 Mersenne Twister,特别是来自 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html 的 mt19937ar.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)
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/
Boost 提供 mt19937 和 mt19937_64 http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random/reference.h
我有一小段代码可以运行 Mersenne Twister PRNG,效果很好: std::random_device randDev; std::mt19937 twister(randDev());
所以我有一个使用 Mersenne Twister 的自定义随机发生器类(我使用的代码改编自 this site)。一切似乎都运行良好,直到我开始测试不同的种子(我通常使用 42 作为种子,以确保每次
我正在将一个大型科学模拟软件迁移到 C++。在 Java 中我使用了 Cern Colt library它包括一个完整的随机分布列表。 当需要不同的发行版(例如提供的链接中列出的发行版)时,通常使用什
我读到“梅森扭曲器的计算复杂度为 O(p2),其中 p 是多项式的次数”。 这是什么意思? 这是指哪个多项式? 此外,计算复杂度是时间复杂度的另一种表述方式,还是与算法运行所需的空间量有关? 最佳答案
我有点不确定这个问题的正确论坛。它介于理论比较之间。科学/数学和编程。 我使用 Mersenne-Twister 生成伪随机数。现在,从给定的种子开始,我想跳到序列中的第 n 个数字。 我看过这个:h
这个问题在这里已经有了答案: stl random distributions and portability (1 个回答) 关闭 8 年前。 我正在使用 std::mt19937_64 生成随机
我的构造函数有什么问题?每次我调用一个应该生成随机数的函数(大约每五秒一次)时,它都会生成相同的数字。每个调用实例化下面这些对象之一。我以为我是用 m_rd 的 operator() 调用的输出随机播
我想知道如何将梅森随机数生成器保留为成员变量并在同一个类中使用它。 我编写了如下类,它运行良好,但我不喜欢 std::mt19937 被初始化。我想知道有没有办法在Test的构造函数中初始化它? #i
我有一个很简单的问题:当我们使用 Mersenne Twister -19937 生成器并修复种子时,每次调用生成器时,它都会生成具有某些特征(独立性、均匀分布)的数字序列。这里重要的是独立性(或 2
众所周知,可以反转 MT 回火功能。可在线获取源代码来执行此操作 here .我试图弄清楚这是如何工作的,以及我将如何以编程方式解决这个问题和类似的问题。 我正在努力解决的是,对有限大小的变量进行移位
我读到 Mersenne Twister 生成器的周期为 2¹⁹⁹³⁷ - 1,但我很困惑为什么会这样。我看到 this implementation Mersenne Twister 算法,在第一条
我尝试使用 32 位种子实现跨平台一致的随机数生成。大多数帖子都指向我Mersenne Twister或者编写我自己的实现。 在 source code有一个名为 void init_by_array
我想生成 1000 个不同的 k 值并计算 k 的均值和方差,但是当我使用 MT 时,它在电子表格中始终是相同的数字。以下是我的代码,希望有人能帮助我。非常感谢! int main(int argc,
我最近在使用 Mersenne-Twister 算法在 C++ 中生成随机数时遇到了一个问题。当遍历for循环并使用cout输出生成的数字时,它会重复输出相同的数字。例如,它输出类似 11 11 11
我想找出我可以用 C++ 为随机数生成器播种的最大值。我的代码如下: mt19937 myRandomGenerator(seed); 变量 seed 可以有多大?我注意到,如果该值变得太大,随机数生
我正在使用 Mersenne Twister 生成具有 1D 柏林噪声的 2D 地形以获取随机数。我的第一个想法是使用 Mersenne Twister 在任何给定的硬件上使用相同的种子总是给我相同的
我编写了一个包含不同算法的 RNG 类,但它没有按预期工作。除了我想使用正常(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值)或仅返回区间 [min,max] 中的 2 个数字: s
我想使用 mt19937 遍历一个数组并从中获取每个值一次,但顺序是随机的。本质上,有没有一种方法可以使用 mt19937 仅生成一次特定范围内的所有数字(不只是忽略重复项,而是确保它不会完全产生重复
我正在我的应用程序中调整 Mersenne Twister,特别是来自 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937a
我是一名优秀的程序员,十分优秀!