Ich habe den schweren Weg entdeckt, dass diese Methode kläglich schief zu laufen scheint, wenn man sie mit einer Potenz von 2 füttert. Bei zwei Random-Objekten mit unterschiedlichen Seeds scheint es die erste Integerzahl zu sein, wenn sie eine Ganzzahl zwischen 0 (inklusive ) und und eine Macht von zwei (exklusiv) ist immer gleich; die Samen sind egal. Zum Beispiel:
%Vor%Ich habe 2 ^ 4 willkürlich gewählt, aber es scheint für jede Zweierpotenz zu funktionieren. Was ist los? Außerdem, wie kann ich das vermeiden?
Dieses Problem tritt aus zwei Gründen auf.
Random
class. nextInt(int n)
, wenn n die Potenz von 2 ist Weil Sie eine neue Random
-Instanz mit einem neuen seed
-Wert initiiert haben, der Einfluss auf die nextInt
-Wertgenerierung hat. Laut Java-Dokumenten von Random (lange Saat) .
Erstellt einen neuen Zufallszahlengenerator mit einem einzelnen langen Seed. Der Startwert ist der Anfangswert des inneren Zustandes des Pseudozufallszahlengenerator, der mit der Methode next (int) gepflegt wird.
%Vor%
Wenn Sie versuchen, einen Zufallswert ohne new seed
zu generieren, wird ein echter Zufallswert generiert, obwohl eine neue Instanz von Random
class.
Ausgabe: 2 1 12 4 3 9 9 8 2 9
Außerdem Random # nextInt hat eine Potenz von 2. Wenn n eine Potenz von 2 ist, gibt es (int)((n * (long)next(31)) >> 31)
zurück, was immer gleich für n ist. Gemäß nextInt
Algorithmus,