在给定一组数据的情况下获得pRNG的基础种子

时间:2017-05-31 04:05:30

标签: 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, 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链接的数学计算。它看起来对我来说,但完全有可能它不是。

0 个答案:

没有答案