Development Class Java

/*
 * @(#)RandomUtil.java  1.0 Apr 26, 2008
 *
 *  The MIT License
 *
 *  Copyright (c) 2008 Malachi de AElfweald 
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
//package org.eoti.math;
import java.math.BigInteger;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;
public class RandomUtil
{
  protected static ReentrantLock singletonLock = new ReentrantLock();
  protected static RandomUtil singleton;
  public static RandomUtil getInstance()
  {
    // If singleton != null, then just return it (don't lock READ)
    if(singleton == null)
    {
      // don't let more that one person create the singleton
      singletonLock.lock();
      // if we were waiting for a lock, then someone else already made it
      if(singleton == null)
        singleton = new RandomUtil();
      singletonLock.unlock();
    }
    return singleton;
  }
  protected RandomUtil()
  {
    random = new Random( (new Date()).getTime() );
  }
  protected Random random;
  public static int randInt(int maxNumExclusive)
  {
    return getInstance().random.nextInt(maxNumExclusive);
  }
  public static BigInteger randomBitFlip(BigInteger n)
  {
    if(n.equals(BigInteger.ONE)) return BigInteger.ONE;
    if(n.equals(BigInteger.ZERO)) return BigInteger.ZERO;
    BigInteger toRet = BigInteger.ONE;
    while(toRet.equals(BigInteger.ONE) || toRet.equals(BigInteger.ZERO))
    {
      byte[] bytes = n.toByteArray();
      getInstance().random.nextBytes( bytes );
      // could allow up to maxExclusive by converting and checking value
      // but this is faster, even if it doesn't give us full range
      bytes[0] = 0;
      toRet = new BigInteger(bytes);
    }
    return toRet;
  }
}