좋아요, 근본적인 문제는 다른 사람들이 지적했듯이 정수 나누기가 아닌 부동 소수점 나누기를해야한다는 것입니다.
그러나이 특정 코드를 수정하는 것은 요점과 관련이 있습니다. 왜 처음부터 신경 써야합니까? 그것은 본질적으로 같은 클래스의 알고리즘을 java.lang.Random으로 사용하고 있습니다!
빠른 생성기를 원할 경우 XORShift generator을 고려하십시오. 양질의 생성기를 원한다면, 당신은 SecureRandom을 가지고 있습니다. (훨씬 느리지 만) 숫자 작성법 알고리즘 (매우 빠른 결합 된 생성기)을 고려하면 다음과 같이 Java로 구현할 수 있습니다.
public class HighQualityRandom extends Random {
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();
}
@Override
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;
return (x + v)^w;
} finally {
l.unlock();
}
}
protected int next(int bits) {
return (int) (nextLong() >>> (64-bits));
}
}
이 코드는 내가 필요한 코드에서 복사됩니다. 당신은 원칙적으로 자물쇠를 제거하거나, 그냥 정기적 인 동기화를 사용할 수 있습니다.
Park Miller-Carta 사용을 절대적으로 주장한다면, 난 적어도 임의의 서브 클래스로 포장하고, java.util.Random이 정수를 두 배로 변환하는 것을 처리하게한다. 객체 지향 언어의 확장 가능한 라이브러리는 ...
왜? 그것이 자신의 교화를위한 것이라면 그것은 한 가지입니다. 그러나 생산 코드가 실제로 (즉, 암호로 안전한) 난수 생성은 옳은 일을하기가 대단히 어렵습니다. RNG는 아마도 대부분의 암호 시스템에서 가장 큰 기술적 취약성 일 것입니다. –
@Chris AND Park-Miller-Carta는 다소 나쁩니다. – Varkhan