Algorithm 在给定数据数组的情况下获取pRNG的基本种子

Algorithm 在给定数据数组的情况下获取pRNG的基本种子,algorithm,random,Algorithm,Random,我想知道,给定一个已知的PRNG和一组值,是否可以计算出PRNG的基本种子。例如,假设我有一个数据数组 var a = [255, 192, 0, 3, 72] 我知道这些值都是通过调用PRNG.nextInt()生成的。因此,对PRNG.nextInt()的第一个调用返回255,下一个调用返回192,依此类推。如果你只得到了那个数据集,有没有PRNG算法给我原始种子?这样你就可以做这样的事情: var seed = PRNG.getSeedForData([255, 192, 0, 3, 7

我想知道,给定一个已知的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
我看了这篇文章()和这篇文章(),但我不确定如何处理这些信息。不过,这两篇文章似乎都没有找到解决问题的方法,我也不想发表

然而,根据我从这些帖子中了解到的一点,看起来线性同余生成器可能是一条出路,但我甚至不完全确定如何接近它们

为了澄清,我试图编写一个PRNG算法,当提供一系列数字时,它也可以给我一个种子。算法中的nextInt()函数在理想情况下应始终返回0到255之间的值,但我不确定这是否与问题有关


更新

因此,使用评论中的链接和建议,看起来反向线性同余生成器是一种可行的方法。我用javascript编写了一个函数来计算给定一组数据的LCG的模'm',但我遇到了一个问题:

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);
功能gcd(a、b)
{
而(b!=0)
{
t=b;
b=a%b;
a=t;
}
返回a;
}
var numbers=[这是0-255个整数的任意随机数组],
m=0;
对于(变量i=0;i
问题是此代码总是返回m=1,这显然是不正确的。如果m是1,线性同余生成器将只有mod 1,它将始终为整数返回0。我做错了什么,或者我误解了其他相关的问题和答案。给定一组完全随机的整数,是否可以从PRNG中获得种子值


就代码而言,GCD函数是基于维基百科的条目的。其余部分基于@Dukeling链接中的数学。在我看来,这是正确的,但完全可能不是。

您的“数据集”是否从PRNG的第一个输出值开始?如果是的话,这将大大缩小搜索空间。根据能够扔掉所有不匹配的种子,猜测大小至少为1/256。但总的来说,这些问题似乎告诉你如何反转线性同余生成器。1) 使用这些步骤写一个2)反转。所需PRNG的质量要求是什么?@plasmacel如果你是指加密,则没有。它根本不需要是安全的,只要给定一组data@TheMasterGabriel我是说统计上的随机性。LCG通常相当糟糕。可能回答了你的问题。破解任何PRNG的问题可能太广泛了。