edu.ksu.cis.kdd.util
Class MersenneTwisterFast

java.lang.Object
  extended byedu.ksu.cis.kdd.util.MersenneTwisterFast
All Implemented Interfaces:
java.io.Serializable

public class MersenneTwisterFast
extends java.lang.Object
implements java.io.Serializable

MersenneTwister and MersenneTwisterFast

Version 7, based on version MT199937(99/10/29) of the Mersenne Twister algorithm found at The Mersenne Twister Home Page, with the initialization improved using the new 2002/1/26 initialization algorithm By Sean Luke, July 2003.

MersenneTwister is a drop-in subclass replacement for java.util.Random. It is properly synchronized and can be used in a multithreaded environment. On modern VMs such as HotSpot, it is approximately 1/3 slower than java.util.Random.

MersenneTwisterFast is not a subclass of java.util.Random. It has the same public methods as Random does, however, and it is algorithmically identical to MersenneTwister. MersenneTwisterFast has hard-code inlined all of its methods directly, and made all of them final (well, the ones of consequence anyway). Further, these methods are not synchronized, so the same MersenneTwisterFast instance cannot be shared by multiple threads. But all this helps MersenneTwisterFast achieve well over twice the speed of MersenneTwister. java.util.Random is about 1/3 slower than MersenneTwisterFast.

About the Mersenne Twister

This is a Java version of the C-program for MT19937: Integer version. The MT19937 algorithm was created by Makoto Matsumoto and Takuji Nishimura, who ask: "When you use this, send an email to: matumoto@math.keio.ac.jp with an appropriate reference to your work". Indicate that this is a translation of their algorithm into Java.

Reference. Makato Matsumoto and Takuji Nishimura, "Mersenne Twister: A 623-Dimensionally Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3--30.

About this Version

Changes Since V6: License has changed from LGPL to BSD. New timing information to compare against java.util.Random. Recent versions of HotSpot have helped Random increase in speed to the point where it is faster than MersenneTwister but slower than MersenneTwisterFast (which should be the case, as it's a less complex algorithm but is synchronized).

Changes Since V5: New empty constructor made to work the same as java.util.Random -- namely, it seeds based on the current time in milliseconds.

Changes Since V4: New initialization algorithms. See (see http://www.math.keio.ac.jp/matumoto/MT2002/emt19937ar.html)

The MersenneTwister code is based on standard MT19937 C/C++ code by Takuji Nishimura, with suggestions from Topher Cooper and Marc Rieffel, July 1997. The code was originally translated into Java by Michael Lecuyer, January 1999, and the original code is Copyright (c) 1999 by Michael Lecuyer.

Java notes

This implementation implements the bug fixes made in Java 1.2's version of Random, which means it can be used with earlier versions of Java. See the JDK 1.2 java.util.Random documentation for further documentation on the random-number generation contracts made. Additionally, there's an undocumented bug in the JDK java.util.Random.nextBytes() method, which this code fixes.

Just like java.util.Random, this generator accepts a long seed but doesn't use all of it. java.util.Random uses 48 bits. The Mersenne Twister instead uses 32 bits (int size). So it's best if your seed does not exceed the int range.

MersenneTwister can be used reliably on JDK version 1.1.5 or above. Earlier Java versions have serious bugs in java.util.Random; only MersenneTwisterFast (and not MersenneTwister nor java.util.Random) should be used with them.

License

Copyright (c) 2003 by Sean Luke.
Portions copyright (c) 1993 by Michael Lecuyer.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Version:
7
See Also:
Serialized Form

Constructor Summary
MersenneTwisterFast(int[] array)
          Constructor using an array.
 
Method Summary
static void main(java.lang.String[] args)
          Tests the code.
 boolean nextBoolean()
           
 boolean nextBoolean(double probability)
          This generates a coin flip with a probability probability of returning true, else returning false.
 boolean nextBoolean(float probability)
          This generates a coin flip with a probability probability of returning true, else returning false.
 byte nextByte()
           
 void nextBytes(byte[] bytes)
           
 char nextChar()
           
 double nextDouble()
          Returns a random double. 1.0 and 0.0 are both valid results.
 float nextFloat()
           
 double nextGaussian()
           
 int nextInt()
           
 int nextInt(int n)
          Returns an integer drawn uniformly from 0 to n-1.
 long nextLong()
           
 long nextLong(long n)
          Returns a long drawn uniformly from 0 to n-1.
 short nextShort()
           
 double raw()
           Returns a 32 bit uniformly distributed random number in the open unit interval (0.0,1.0) (excluding 0.0 and 1.0).
 void setSeed(int[] array)
          An alternative, more complete, method of seeding the pseudo random number generator. array must be an array of 624 ints, and they can be any value as long as they're not *all* zero.
 void setSeed(long seed)
          Initalize the pseudo random number generator.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

MersenneTwisterFast

public MersenneTwisterFast(int[] array)
Constructor using an array.

Method Detail

setSeed

public void setSeed(long seed)
Initalize the pseudo random number generator. Don't pass in a long that's bigger than an int (Mersenne Twister only uses the first 32 bits for its seed).


setSeed

public void setSeed(int[] array)
An alternative, more complete, method of seeding the pseudo random number generator. array must be an array of 624 ints, and they can be any value as long as they're not *all* zero.


nextInt

public final int nextInt()

nextShort

public final short nextShort()

nextChar

public final char nextChar()

nextBoolean

public final boolean nextBoolean()

nextBoolean

public final boolean nextBoolean(float probability)
This generates a coin flip with a probability probability of returning true, else returning false. probability must be between 0.0 and 1.0, inclusive. Not as precise a random real event as nextBoolean(double), but twice as fast. To explicitly


nextBoolean

public final boolean nextBoolean(double probability)
This generates a coin flip with a probability probability of returning true, else returning false. probability must


nextByte

public final byte nextByte()

nextBytes

public final void nextBytes(byte[] bytes)

nextLong

public final long nextLong()

nextLong

public final long nextLong(long n)
Returns a long drawn uniformly from 0 to n-1. Suffice it to say,


nextDouble

public final double nextDouble()
Returns a random double. 1.0 and 0.0 are both valid results.


nextGaussian

public final double nextGaussian()

nextFloat

public final float nextFloat()

nextInt

public final int nextInt(int n)
Returns an integer drawn uniformly from 0 to n-1. Suffice it to say,


main

public static void main(java.lang.String[] args)
Tests the code.


raw

public double raw()

Returns a 32 bit uniformly distributed random number in the open unit interval (0.0,1.0) (excluding 0.0 and 1.0).

Adapted from COLT.jar library.
http://hoschek.home.cern.ch/hoschek/colt/

This method is taken from cern.jet.random.engine.RandomEngine.