Is there a way to generate a seed out of a sequence of numbers?

Frank Smith picture Frank Smith · Jan 20, 2012 · Viewed 8.5k times · Source

For example if java produces the pseudorandom sequence: 9 3 2 5 6 by using 23 as a seed, how can I do the inverse? i.e. getting 23 out of the sequence 9 3 2 5 6.

Or how do I assign a seed for a certain sequence?

It is easy to do if there is a database - just assign a random key for the sequence

INSERT INTO SEQUENCE_TABLE VALUES (RANDOM_KEY, SEQUENCE)

However if I'm not permitted to use a database, Is there a formula to do such a thing?

Answer

ingyhere picture ingyhere · Mar 11, 2015

Yes, it's absolutely easy to reverse engineer the number stream of a poorly designed pseudo random number generator, such as the Linear Congruential PRNG implementation in the Java programming language (java.util.Random).

In fact, with as few as TWO values from that particular generator, and the information on the order in which the values emerged, the entire stream can be predicted.

Random random = new Random();
long v1 = random.nextInt();
long v2 = random.nextInt();
for (int i = 0; i < 65536; i++) {
    long seed = v1 * 65536 + i;
    if (((seed * multiplier + addend) & mask) >>> 16) == v2) {
        System.out.println("Seed found: " + seed);
        break;
    }
}

This is precisely why it's critical to use cryptographically secure random number generators that have been vetted by the community at large for implementations that require security.

There is much more information on reverse engineering PRNGs, including java.util.Random here. ...