2016-10-13 2 views
0

Ich verwende PRNGs aus der Java Diehard Randomness Test Suite (https://sourceforge.net/projects/jrandtest/). Alle Algorithmen haben drei Methoden Zufallszahlen abzurufen:Anpassung von Ergebnissen aus einem PRNG in einen maximalen Minbereich

readByte() 
readInt() 
readLong() 

Ausführen einer schnellen Schleife des AES-Algorithmus erzeugt diese Zahlen:

Byte: -102 
Int: -252497821 
Long: 5882262596119081845 
Byte: -68 
Int: 1688727157 
Long: 436050817787325007 

ich brauche, um zufällige ganze Zahlen im Bereich von 0-36 zu erzeugen (inklusive). Keine der Klassen hat eine ähnliche Methode wie nextInt (int gebunden), die Random() und SecureRandom() haben. Wie passe ich die Nummer, die ich von der PRNG bekomme, in den Bereich an, den ich brauche? Vielen Dank!

Antwort

0

Der naive Ansatz wäre, das Ergebnis von readInt() % myMaxValue zu nehmen, aber das wird schiefe Verteilungen erzeugen, weil es die niedrigstwertigen Bits der erzeugten Werte verwendet (die zufällig die niedrigste Entropie haben).

Lesen Sie die Spezifikation von Random.nextInt(int), um eine Vorstellung davon zu bekommen, wie sie umgehen. Und natürlich gibt es the source of openjdk, von denen Sie sich inspirieren lassen können.

+0

war gerade dabei, das gleiche zu sagen, wenn es darum ging, grepcode zu lesen und sich an die Implementierung anzupassen –

Verwandte Themen