package org.jgap.util;
/**
Implementation of a randomX-compliant class using the
simple (and not very good) rand() linear congruential
generator given as an example in the ANSI C specification. This
is intended not for serious use, merely as an illustration of a
simple software-based randomX generator.
The generation algorithm is:
Ij+1 = (Ijx1103515245+12345) & 0x7FFFFFFF
Designed and implemented in July 1996 by
John Walker,
kelvin@fourmilab.ch.
*/
public class randomLCG extends randomX {
long state;
// Constructors
/** Creates a new pseudorandom number generator, seeded from
the current time. */
public randomLCG() {
this.setSeed(System.currentTimeMillis());
}
/** Creates a new pseudorandom number generator with a
specified seed.
@param seed initial seed for the generator
*/
public randomLCG(long seed) {
this.setSeed(seed);
}
// Seed access
/** Set seed for generator. Subsequent values will be based
on the given seed.
@param seed seed for the generator
*/
public void setSeed(long seed) {
super.setSeed(); // Notify parent seed has changed
state = seed & 0xFFFFFFFFL;
}
/** Get next byte from generator. Given how poor this generator
is, it's wise to make a separate call for each byte rather than
extract fields from a single call, which may be correlated.
Also, the higher-order bits of this generator are more
random than the low, so we extract the byte after discarding
the low-order 11 bits.
@return the next byte from the generator.
*/
public byte nextByte() {
state = (state * 1103515245L + 12345L) & 0x7FFFFFFFL;
return (byte) ((state >> 11) & 0xFF);
}
};
Ads help maintain this website.