mersenne twister - 有没有办法跳到特定的州?

时间:2010-11-15 12:50:48

标签: algorithm random mersenne-twister

我对这个问题的正确论坛有点不确定。它介于理论之间。 sci./math和编程。

我使用Mersenne-Twister生成伪随机数。现在,从给定的种子开始,我想跳到序列中的第n个数字。

我见过这个:http://www-personal.umich.edu/~wagnerr/MersenneTwister.html,一个方案可能如下:

假设我只需要来自特定种子 s 的完整随机序列中的第一个 N 数字。
我将序列分成 p 子序列,遍历所有N个数字,并在每个子序列的开头保存随机数生成器的状态向量。
现在要达到 n -th number,我会看到 n 落在 k -th子序列中,我将加载状态向量对于该子序列并生成 m 个连续随机数,其中第k个子序列中的第m个数与完整序列中的第n个数相同(n = m +(k-1)* N / p)。

但是状态向量是624 x 4字节长!我想知道是否几乎可以跳转到mersenne-twister生成序列中的任意元素。

4 个答案:

答案 0 :(得分:5)

是的,这是可能的!它被称为前进

您可以在MT作者的主页上找到Mersenne Twister所做的所有细节。可以使用代码以及解释算法的科学出版物:

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/JUMP/index.html

答案 1 :(得分:2)

Mersenne Twister可以表示为F 2 (包含两个元素0和1的字段)上的(相当大)矩阵。转换到下一个状态是乘以此矩阵。

要跳转到流中的某个任意位置,您可以通过重复平方来计算此矩阵的相应功效,并将其与初始状态相乘。

答案 2 :(得分:1)

如今,有一种方法可以使用discard来执行此操作。复杂程度在等价提前额方面是线性的。

一个工作示例:

  std::mt19937 engine(0);
  std::uniform_int_distribution<int> dis(0, 9);
  auto generator = std::bind(std::ref(dis), std::ref(engine));

  qDebug() << "First sequence: ";
  for (int i = 0; i < 20; i++) {
    qDebug() << "Random value: " << generator();
  }

  engine.seed(0); // reset
  engine.discard(15); // discard the first 15 numbers from the first sequence
  qDebug() << "Last five numbers from first sequence: ";
  for (int i = 0; i < 5; i++) {
    qDebug() << "Random value: " << generator();
  }

答案 3 :(得分:-5)

我认为你要求的是反对加密安全随机数发生器的定义,所以很遗憾我不认为这是可能的。