/** * Modified from JavaSim RandomStream class to incorporate xorshift generators from Marsaglia as * basic generators. See the article * Marsaglia, George (July 2003). "Xorshift RNGs". Journal of Statistical Software 8 (14). * http://www.jstatsoft.org/v08/i14/paper */ import java.io.IOException; public abstract class RandomStream { /** * In derived classes this method returns the value obtained by the stream. * It must be redefined by the deriving class. */ public abstract double getNumber () throws IOException, ArithmeticException; protected RandomStream() { suffled=false; } protected RandomStream(boolean suffle) { suffled=suffle; if(suffled) { for (int i = 0; i < RandomStream.sizeOfSeries; i++) series[i] = xor64(); } } protected RandomStream(long Seed, boolean suffle) { x=Seed; if(suffled) { for (int i = 0; i < RandomStream.sizeOfSeries; i++) series[i] = xor64(); } } protected final double uniform () { if(!suffled) { return 0.5d*(1.d + xor64()/(double) 0x7FFFFFFFFFFFFFFFL);} else { choose = (xor()%128 +127)%128 ; result = 0.5d*(1.d +series[choose]/(double) 0x7FFFFFFFFFFFFFFFL); series[choose] = xor64() ; return result; } } private long xor64(){ x ^=(x<<13); x ^=(x>>7); return (x ^=(x<<17)); } private int xor(){ y ^= (y<<13); y ^= (y>>17); y ^= (y<<5); return y; } private long x=88172645463325252L; private int y=100000; private double result; private boolean suffled; private static int sizeOfSeries=128; private long[] series = new long[128]; private int choose; }