package net.varkhan.base.functor.generator;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 2/2/14
* @time 2:46 PM
*/
public abstract class AbstractRNG implements RNG {
protected static final double DNORM = 5.42101086242752217e-20;
@Override
public boolean nextBoolean() {
return 1==(1&nextLong());
}
@Override
public int nextInt() {
return (int) (0xFFFFFFFFL&nextLong());
}
@Override
public int nextInt(int n) {
if (n <= 0) throw new IllegalArgumentException("n must be positive");
long bits, val;
do {
bits = nextLong();
val = bits % n;
} while (bits - val + (n-1) < 0);
return (int) (0xFFFFFFFFL&val);
}
@Override
public long nextLong(long n) {
if (n <= 0) throw new IllegalArgumentException("n must be positive");
long bits, val;
do {
bits = nextLong();
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}
@Override
public float nextFloat() {
return (float)(DNORM*nextLong());
}
@Override
public float nextFloat(float n) {
return (float)(n*DNORM*nextLong());
}
@Override
public double nextDouble() {
return DNORM*nextLong();
}
@Override
public double nextDouble(double n) {
return n*DNORM*nextLong();
}
}