home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / util / Random.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  3.7 KB  |  161 lines

  1. package java.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.ObjectStreamField;
  7. import java.io.Serializable;
  8. import java.io.StreamCorruptedException;
  9. import java.util.concurrent.atomic.AtomicLong;
  10. import sun.misc.Unsafe;
  11.  
  12. public class Random implements Serializable {
  13.    static final long serialVersionUID = 3905348978240129619L;
  14.    private final AtomicLong seed;
  15.    private static final long multiplier = 25214903917L;
  16.    private static final long addend = 11L;
  17.    private static final long mask = 281474976710655L;
  18.    private static volatile long seedUniquifier = 8682522807148012L;
  19.    private double nextNextGaussian;
  20.    private boolean haveNextNextGaussian;
  21.    private static final ObjectStreamField[] serialPersistentFields;
  22.    private static final Unsafe unsafe;
  23.    private static final long seedOffset;
  24.  
  25.    public Random() {
  26.       this(++seedUniquifier + System.nanoTime());
  27.    }
  28.  
  29.    public Random(long var1) {
  30.       this.haveNextNextGaussian = false;
  31.       this.seed = new AtomicLong(0L);
  32.       this.setSeed(var1);
  33.    }
  34.  
  35.    public synchronized void setSeed(long var1) {
  36.       var1 = (var1 ^ 25214903917L) & 281474976710655L;
  37.       this.seed.set(var1);
  38.       this.haveNextNextGaussian = false;
  39.    }
  40.  
  41.    protected int next(int var1) {
  42.       AtomicLong var6 = this.seed;
  43.  
  44.       long var2;
  45.       long var4;
  46.       do {
  47.          var2 = var6.get();
  48.          var4 = var2 * 25214903917L + 11L & 281474976710655L;
  49.       } while(!var6.compareAndSet(var2, var4));
  50.  
  51.       return (int)(var4 >>> 48 - var1);
  52.    }
  53.  
  54.    public void nextBytes(byte[] var1) {
  55.       int var2 = 0;
  56.       int var3 = var1.length;
  57.  
  58.       while(var2 < var3) {
  59.          int var4 = this.nextInt();
  60.  
  61.          for(int var5 = Math.min(var3 - var2, 4); var5-- > 0; var4 >>= 8) {
  62.             var1[var2++] = (byte)var4;
  63.          }
  64.       }
  65.  
  66.    }
  67.  
  68.    public int nextInt() {
  69.       return this.next(32);
  70.    }
  71.  
  72.    public int nextInt(int var1) {
  73.       if (var1 <= 0) {
  74.          throw new IllegalArgumentException("n must be positive");
  75.       } else if ((var1 & -var1) == var1) {
  76.          return (int)((long)var1 * (long)this.next(31) >> 31);
  77.       } else {
  78.          int var2;
  79.          int var3;
  80.          do {
  81.             var2 = this.next(31);
  82.             var3 = var2 % var1;
  83.          } while(var2 - var3 + (var1 - 1) < 0);
  84.  
  85.          return var3;
  86.       }
  87.    }
  88.  
  89.    public long nextLong() {
  90.       return ((long)this.next(32) << 32) + (long)this.next(32);
  91.    }
  92.  
  93.    public boolean nextBoolean() {
  94.       return this.next(1) != 0;
  95.    }
  96.  
  97.    public float nextFloat() {
  98.       return (float)this.next(24) / 1.6777216E7F;
  99.    }
  100.  
  101.    public double nextDouble() {
  102.       return (double)(((long)this.next(26) << 27) + (long)this.next(27)) / (double)9.007199E15F;
  103.    }
  104.  
  105.    public synchronized double nextGaussian() {
  106.       if (this.haveNextNextGaussian) {
  107.          this.haveNextNextGaussian = false;
  108.          return this.nextNextGaussian;
  109.       } else {
  110.          double var1;
  111.          double var3;
  112.          double var5;
  113.          do {
  114.             var1 = (double)2.0F * this.nextDouble() - (double)1.0F;
  115.             var3 = (double)2.0F * this.nextDouble() - (double)1.0F;
  116.             var5 = var1 * var1 + var3 * var3;
  117.          } while(var5 >= (double)1.0F || var5 == (double)0.0F);
  118.  
  119.          double var7 = StrictMath.sqrt((double)-2.0F * StrictMath.log(var5) / var5);
  120.          this.nextNextGaussian = var3 * var7;
  121.          this.haveNextNextGaussian = true;
  122.          return var1 * var7;
  123.       }
  124.    }
  125.  
  126.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  127.       ObjectInputStream.GetField var2 = var1.readFields();
  128.       long var3 = var2.get("seed", -1L);
  129.       if (var3 < 0L) {
  130.          throw new StreamCorruptedException("Random: invalid seed");
  131.       } else {
  132.          this.resetSeed(var3);
  133.          this.nextNextGaussian = var2.get("nextNextGaussian", (double)0.0F);
  134.          this.haveNextNextGaussian = var2.get("haveNextNextGaussian", false);
  135.       }
  136.    }
  137.  
  138.    private synchronized void writeObject(ObjectOutputStream var1) throws IOException {
  139.       ObjectOutputStream.PutField var2 = var1.putFields();
  140.       var2.put("seed", this.seed.get());
  141.       var2.put("nextNextGaussian", this.nextNextGaussian);
  142.       var2.put("haveNextNextGaussian", this.haveNextNextGaussian);
  143.       var1.writeFields();
  144.    }
  145.  
  146.    private void resetSeed(long var1) {
  147.       unsafe.putObjectVolatile(this, seedOffset, new AtomicLong(var1));
  148.    }
  149.  
  150.    static {
  151.       serialPersistentFields = new ObjectStreamField[]{new ObjectStreamField("seed", Long.TYPE), new ObjectStreamField("nextNextGaussian", Double.TYPE), new ObjectStreamField("haveNextNextGaussian", Boolean.TYPE)};
  152.       unsafe = Unsafe.getUnsafe();
  153.  
  154.       try {
  155.          seedOffset = unsafe.objectFieldOffset(Random.class.getDeclaredField("seed"));
  156.       } catch (Exception var1) {
  157.          throw new Error(var1);
  158.       }
  159.    }
  160. }
  161.