我想知道,鉴于已知的PRNG和一组值,人们可以计算出PRNG的基础种子。例如,假设我有一个数据数组
var a = [255, 192, 0, 3, 72]
我知道这些值中的每一个都是从调用PRNG.nextInt()生成的。因此,对PRNG.nextInt()的第一次调用返回255,下一次调用返回192,依此类推。如果您只获得该数据集,是否有PRNG算法给我原始种子?所以你可以这样做:
var seed = PRNG.getSeedForData([255, 192, 0, 3, 72])
var prng = new PRNG(seed)
然后使用该prng实例,这应该是真的:
prng.nextInt() == 255
prng.nextInt() == 192
prng.nextInt() == 0
prng.nextInt() == 3
prnt.nextInt() == 72
我查看了这篇文章(Is it possible to reverse a pseudo random number generator?)以及此帖(Given a RNG algorithm and a series of numbers is it possible to determine what seed would produce the series?),但我不确定如何处理这些信息。然而,看起来这两个帖子都没有找到问题的解决方案,而且我也不想要对此进行预防。
基于我从那些帖子中所理解的一点,看起来像线性同余生成器可能是要走的路?,但我并不完全确定如何接近它们。
为了澄清一点,我试着编写一个PRNG算法,在提供一系列数字时也可以给我种子。理想情况下,算法中的 nextInt()函数应始终返回0到255之间的值,但我不确定这是否与问题相关。
更新
因此,使用评论中的链接和建议,它看起来像是反向线性同余生成器。我在javascript中编写了一个函数来计算模数' m'给出一堆数据的LCG,但我遇到了一个问题:
function gcd(a, b)
{
while(b != 0)
{
t = b;
b = a % b;
a = t;
}
return a;
}
var numbers = [this is any random array of 0-255 integers],
m = 0;
for(var i = 0; i < numbers.length - 3; i++)
{
var t0 = numbers[i + 1] - numbers[i],
t1 = numbers[i + 2] - numbers[i + 1],
t2 = numbers[i + 3] - numbers[i + 2],
u0 = Math.abs((t2 * t0) - (t1 * t1));
m = i == 0 ? u0 : gcd(m, u0);
}
console.log(m);
问题是此代码始终返回m = 1,这显然不正确。如果m是1,则线性同余生成器只有mod 1,对于整数,它总是返回0。我做错了什么,或者我误解了其他相关的问题和答案。给定一组完全随机的整数,是否有可能从PRNG获得种子值?
就代码而言,GCD功能基于维基百科的Euclid's Algorithm条目。其余部分基于question and answer @Dukeling链接的数学计算。它看起来对我来说,但完全有可能它不是。