home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 21 / IOPROG_21.ISO / SOFT / JSL.ZIP / JSL20 / simula / random / RandomEngine.java < prev    next >
Encoding:
Java Source  |  1998-02-20  |  4.0 KB  |  141 lines

  1.  
  2. package simula.random;
  3.  
  4. /**
  5.  * The abstract class RandomEngine is the common parent of the entire hierarchy
  6.  * of the pseudo-random number generators. It riproduces the same interface
  7.  * as <code>java.util.Random</code>. The only thing required to have an effective
  8.  * pseudo-random generator is the implementation of the <code>nextByte</code>
  9.  * method.
  10.  * This hierarchy is widely inspired to that realized in July 1996 by
  11.  * <a href="http://www.fourmilab.ch/">John Walker</a>,
  12.  * <a href="mailto:kelvin@fourmilab.ch">kelvin@fourmilab.ch</a>.
  13.  * @see java.util.Random
  14.  */
  15. public abstract class RandomEngine {
  16.  
  17. /**
  18.  * Useful to random bits generation.
  19.  * @see nextBit
  20.  */    
  21.     private int nbits = 0;
  22.     
  23.     private boolean iset = false;
  24.  
  25.     private double gset;
  26.  
  27.     //  Estensione all'interfaccia di java.util.Random
  28.     private byte b;
  29.  
  30.  
  31. /**
  32.  * Returns the next pseudo-random bit.
  33.  * @return the next pseudo-random bit.
  34.  */
  35.     public boolean nextBit() {
  36.         boolean bit;
  37.  
  38.         if (nbits <= 0) {
  39.             b = nextByte();
  40.             nbits = 8;
  41.         }
  42.         bit = (b & 0x80) != 0;
  43.         b <<= 1;
  44.         nbits--;
  45.         return bit;
  46.     }
  47. /** 
  48.  * Returns the next pseudo-random byte.
  49.  * @return the next pseudo-random byte.
  50.  */
  51.     public abstract byte nextByte();
  52. /**
  53.  * Fills the entire given array with pseudo-random generated bytes.
  54.  * @param buf Array to fill.
  55.  */
  56.     public void nextByte(byte buf[]) {
  57.         nextByte(buf, buf.length);
  58.     }
  59. /**
  60.  * Fills the given array with pseudo-random generated bytes.
  61.  * @param buf Array of at least <tt>byte</tt> to fill.
  62.  * @param buflen Number of bytes to store.
  63.  */
  64.     public void nextByte(byte buf[], int buflen) {
  65.         int i = 0;
  66.  
  67.         while (buflen-- > 0) {
  68.             buf[i++] = nextByte();
  69.         }
  70.     }
  71. /**
  72.  * Returns the next pseudo-random double precision floating point
  73.  * value (according to a uniform distribution).
  74.  * @return the next pseudo-random double precision floating point
  75.  * value (according to a uniform distribution).
  76.  */
  77.     public double nextDouble() {
  78.         return (double) ((nextLong() & 0x7FFFFFFFFFFFFFFFl) /
  79.                          (0x7FFFFFFFFFFFFFFFl * 1.0));
  80.     }
  81. /**
  82.  * Returns the next pseudo-random floating point value (according to a uniform distribution).
  83.  * @return the next pseudo-random floating point value (according to a uniform distribution).
  84.  */
  85.     public float nextFloat() {
  86.         return (float) ((nextInt() & 0x7FFFFFFF) / (0x7FFFFFFF * 1.0));
  87.     }
  88. /**
  89.  * Returns the next pseudo-random value according to a normal distribution.
  90.  * @return the next pseudo-random value according to a normal distribution.
  91.  */
  92.     public double nextGaussian() {
  93.         double fac, rsq, v1, v2;
  94.  
  95.         if (!iset) {
  96.             do {
  97.                 v1 = 2 * nextDouble() - 1;
  98.                 v2 = 2 * nextDouble() - 1;
  99.                 rsq = v1 * v1 + v2 * v2;
  100.             } while (rsq > 1.0 || rsq == 0.0);
  101.             fac = Math.sqrt(-2.0 * Math.log(rsq) / rsq);
  102.             gset = v1 * fac;
  103.             iset = true;
  104.             return v2 * fac;
  105.         } else {
  106.             iset = false;
  107.             return gset;
  108.         }
  109.     }
  110.     // Metodi che riproducono l'interfaccia di java.util.Random
  111.  
  112. /**
  113.  * Returns the next pseudo-random integer value (according to a uniform distribution).
  114.  * @return the next pseudo-random integer value (according to a uniform distribution).
  115.  */
  116.     public int nextInt() {
  117.         return (int) ((((int) nextShort()) << 16) | (((int) nextShort()) & 0xFFFF));
  118.     }
  119. /**
  120.  * Returns the next pseudo-random long integer value (according to a uniform distribution).
  121.  * @return the next pseudo-random long integer value (according to a uniform distribution).
  122.  */
  123.     public long nextLong() {
  124.         return (long) ((((long) nextInt()) << 32) | (((long) nextInt()) & 0xFFFFFFFFl));
  125.     }
  126. /**
  127.  * Returns the next pseudo-random short integer value (according to a uniform distribution).
  128.  * @return the next pseudo-random short integer value (according to a uniform distribution).
  129.  */
  130.     public short nextShort() {
  131.         return (short) ((((short) nextByte()) << 8) | ((short) (nextByte() & 0xFF)));
  132.     }
  133. /**
  134.  * The change of seed must be notified to the super class from every
  135.  * child of RandomEngine.
  136.  */
  137.     public void setSeed() {
  138.         nbits = 0;
  139.         iset = false;
  140.     }
  141. }