package org.jgap.util; /** Implementation of a <b>randomX</b>-compliant class using the "Minimal Standard" multiplicative congruential generator of Park and Miller. [Park, S.K. and K.W. Miller, <cite>Communications of the ACM</cite> <b>31</b>, 1192-1201 (1988).] <p> The generation algorithm is: <p> <center> <em>I<sub>j+1</sub></em> = (<em>I<sub>j</sub></em> � 16807) & 0x7FFFFFFF </center> <p> Note that the intermediate value of the multiplication by 16807 (7<sup>5</sup>) exceeds that representable in 32 bits; this has deterred use of this generator in most portable languages. Fortunately, Java's <tt>long</tt> type is guaranteed to be 64 bits, so a straightforward and portable implementation is possible. <p> Designed and implemented in July 1996 by <a href="http://www.fourmilab.ch/">John Walker</a>, <a href="mailto:kelvin@fourmilab.ch">kelvin@fourmilab.ch</a>. */ public class randomMCG extends randomX { long state; // Constructors /** Creates a new pseudorandom number generator, seeded from the current time. */ public randomMCG() { this.setSeed(System.currentTimeMillis()); } /** Creates a new pseudorandom number generator with a specified nonzero seed. @param seed initial seed for the generator */ public randomMCG(long seed) throws IllegalArgumentException { this.setSeed(seed); } // Seed access /** Set seed for generator. Subsequent values will be based on the given nonzero seed. @param seed seed for the generator */ public void setSeed(long seed) throws IllegalArgumentException { int i; if (seed == 0) { throw new IllegalArgumentException("seed must be nonzero"); } super.setSeed(); // Notify parent seed has changed state = seed & 0xFFFFFFFFL; for (i = 0; i < 11; i++) { nextByte(); } } /** Get next byte from generator. @return the next byte from the generator. */ public byte nextByte() { state = (state * 16807) & 0x7FFFFFFFL; return (byte) ((state >> 11) & 0xFF); } };