HighQualityRandom.java :  » Game » completetetris » org » fableStudios » tetris » Java Open Source

Java Open Source » Game » completetetris 
completetetris » org » fableStudios » tetris » HighQualityRandom.java
package org.fableStudios.tetris;

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//http://www.javamex.com/tutorials/random_numbers/numerical_recipes.shtml
public class HighQualityRandom extends Random {
  private static final long serialVersionUID = -2654986030502941885L;
  private Lock l=new ReentrantLock();
  private long u;
  private long v=4101842887655102017L;
  private long w=1;
  
  public HighQualityRandom() {
    this(System.nanoTime());
  }

  public HighQualityRandom(long seed) {
    l.lock();
    {
      u=seed^v;
      nextLong();
      v=u;
      nextLong();
      w=v;
      nextLong();
    }
    l.unlock();
  }
  
  public long nextLong() {
    l.lock();
    try {
      u=u*2862933555777941757L+7046029254386353087L;
      v^=v>>>17;
      v^=v<<31;
      v^=v>>>8;
      w=4294957665L*(w&0xFFFFFFFF)+(w>>>32);
      long x=u^(u<<21);
      x^=x>>>35;
      x^=x<<4;
      long ret=(x+v)^w;
      return ret;
    } finally {
      l.unlock();
    }
  }
  
  protected int next(int bits) {
    return (int)(nextLong()>>>64-bits);
  }
  
  @Override
  public int nextInt(int limit) {
    long l=nextLong();
    int i=(int)(l/1000);
    if(i<0)i=-i;
    return i%limit;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.