ОК, поэтому основная проблема заключается в том, что вам нужно выполнять деление с плавающей запятой, а не целое деление, как указывали другие.
Но я думаю, что исправление этого конкретного кода является чем-то вроде точки. Зачем беспокоиться об этом в первую очередь? Он использует по существу тот же класс алгоритма java.lang.Random!
Если вы хотите быстрый генератор, рассмотрите XORShift generator. Если вы хотите генератор хорошего качества, у вас есть SecureRandom из коробки (хотя он намного медленнее), рассмотрите алгоритм Numerical Recipes (довольно быстрый комбинированный генератор), который можно реализовать на 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, я бы по крайней мере обернул его в подклассу Random, и пусть java.util.Random позаботится о преобразовании ints в double и т. Д. В конце концов, вот что расширяемые библиотеки в объектно-ориентированном языке для ...
Почему? Если это для вашего собственного назидания, это одно, но для производственного кода действительно хорошее (т.е. криптографически безопасное) генерирование случайных чисел чрезвычайно сложно сделать правильно. RNG, вероятно, является самой большой технической уязвимостью в большинстве криптосистем. –
@ Крис и Парк-Миллер-Карта довольно плохие. – Varkhan