我对这个问题的正确论坛有点不确定。它介于理论之间。 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生成序列中的任意元素。
答案 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)
我认为你要求的是反对加密安全随机数发生器的定义,所以很遗憾我不认为这是可能的。