Im Beispiel Josh von der fehlerhaften Zufallsmethode gibt, die eine positive Zufallszahl mit einem oberen n
gebunden gegeben erzeugt, ich verstehen nicht, die beide von die Fehler, die er angibt.Effective Java Artikel 47: kennen und nutzen Sie Ihre Bibliotheken - Flawed Zufallszahl-Methode Beispiel
Das Verfahren ist vom Buch:
private static final Random rnd = new Random();
//Common but deeply flawed
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
- Er sagt, dass, wenn n eine kleine Potenz von 2, die Folge von Zufallszahlen, die erzeugt werden, wird sich der Zeit nach kurzer Zeit wiederholen. Warum ist das der Fall? Die Dokumentation für
Random.nextInt()
sagtReturns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
Also sollte es nicht sein, dass, wenn n eine kleine ganze Zahl ist, dann wiederholt sich die Sequenz selbst, warum gilt dies nur für Potenzen von 2? - Als nächstes sagt er, dass, wenn n keine Potenz von 2 ist, einige Zahlen im Durchschnitt häufiger zurückgegeben werden als andere. Warum tritt dies auf, wenn
Random.nextInt()
Zufallszahlen erzeugt, die gleichmäßig verteilt sind? (Er stellt ein Code-Snippet zur Verfügung, das dies deutlich zeigt, aber ich verstehe nicht, warum das der Fall ist und wie dies damit zusammenhängt, dass n eine Potenz von 2 ist).
Warum sollte diese Methode jemals verwendet werden? 'rnd.nextInt (n) ' –
@Elliott Das ist der Punkt des Beispiels in dem Buch. – Kevin
Ich bin amüsiert, dass der Autor den größten Fehler übersehen: Dieser Code wird manchmal negative Zahlen zurückgeben! –