Was ist los mit diesem gebrochenen Java Random.nextInt (long) Verhalten?

8

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?

    
Nick Holt 18.11.2013, 06:23
quelle

2 Antworten

5

Dieses Problem tritt aus zwei Gründen auf.

  1. Gleicher Seed für Random class.
  2. At nextInt(int n) , wenn n die Potenz von 2 ist

1. Gleicher Seed für die Random-Klasse.

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.

%Vor%

Ausgabe: 2 1 12 4 3 9 9 8 2 9

2. Bei nextInt (int n), wenn n die Potenz von 2 ist

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,

%Vor%     
Masudul 18.11.2013 06:27
quelle
0

Sie können Math.random und Math.pow auch zusammen verwenden, um mehr Einfachheit zu erreichen, wenn Sie möchten.

%Vor%     
Corjava 18.11.2013 06:37
quelle

Tags und Links