Mega Code Archive

 
Categories / Java / Development Class
 

Random Util with ReentrantLock

/*  * @(#)RandomUtil.java  1.0 Apr 26, 2008  *  *  The MIT License  *  *  Copyright (c) 2008 Malachi de AElfweald <malachid@gmail.com>  *  *  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;   } }