OK, also ist das wesentliche Problem, dass Sie Gleitkommadivision, nicht Ganzzahldivision machen müssen, wie andere hingewiesen haben.
Aber ich denke, das Fixieren dieses bestimmten Codes ist eine Art neben dem Punkt. Warum sollte man sich überhaupt damit beschäftigen? Es ist im Wesentlichen die gleiche Klasse von Algorithmus ist java.lang.Random!
Wenn Sie einen schnellen Generator wünschen, denken Sie an XORShift generator. Wenn Sie einen Generator von guter Qualität wünschen, haben Sie SecureRandom out of the box (obwohl es viel langsamer ist), beachten Sie den Numerical Recipes Algorithmus (ein ziemlich schneller, kombinierter Generator), den Sie in Java wie folgt implementieren könnten:
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));
}
}
Dies wird von einem Code kopiert, wo ich es gleichzeitig benötigt; Sie könnten das Schloss im Prinzip loswerden oder einfach die normale Synchronisation verwenden.
Wenn Sie unbedingt darauf bestehen, Park-Miller-Carta zu verwenden, würde ich es zumindest in eine Random-Unterklasse einbinden und java.util.Random dafür sorgen, dass Ints in Doubles umgerechnet werden - das ist es schließlich erweiterbare Bibliotheken in einer objektorientierten Sprache sind für ...
Warum? Wenn es für Ihre eigene Erbauung ist, ist das eine Sache, aber für Produktionscode wirklich gut (dh kryptographisch sicher) ist Zufallszahlenerzeugung äußerst schwierig, richtig zu tun. Der RNG ist wahrscheinlich die größte technische Schwachstelle in den meisten Kryptosystemen. –
@Chris UND Park-Miller-Carta ist ziemlich schlecht. – Varkhan