Was ist der beste Weg, um die Werte eines PRNG auf einen kleineren Bereich zu beschränken? Wenn Sie den Modulus verwenden und die alte maximale Zahl nicht durch die neue maximale Zahl teilbar ist, dann richten Sie sich auf die 0
bis (old_max - new_max - 1)
. Ich nehme an, der beste Weg wäre in etwa so sein (dies ist Gleitkomma, nicht integer math)Was ist die richtige Methode, um eine Pseudozufallszahl auf einen kleineren Bereich zu beschränken?
random_num = PRNG()/max_orginal_range * max_smaller_range
aber etwas in meinem Bauch macht mich diese Methode in Frage (vielleicht Punkt Umsetzung und Darstellung Unterschiede Floating?).
Der Zufallszahlengenerator wird konsistente Ergebnisse über die Hardware- und Softwareplattformen hinweg liefern, und die Einschränkung muss auch.
Ich hatte Recht, den Pseudocode oben zu bezweifeln (aber nicht aus den Gründen, die ich dachte). MichaelGGs answer hat mich auf andere Weise über das Problem nachdenken lassen. Ich kann es mit kleineren Zahlen modellieren und jedes Ergebnis testen. Nehmen wir an, wir haben einen PRNG, der eine Zufallszahl zwischen 0 und 31 erzeugt, und Sie möchten, dass der kleinere Bereich zwischen 0 und 9 liegt. Wenn Sie modul verwenden, orientieren Sie sich an 0, 1, 2 und 3. Wenn Sie den Pseudocode verwenden über Ihnen neigen Sie in Richtung 0, 2, 5 und 7. Ich denke nicht, dass es einen guten Weg geben kann, einen Satz in den anderen zu kartieren. Das Beste, was ich bisher herausgefunden habe, ist, die Zufallszahlen zu regenerieren, die größer sind als old_max/new_max
, aber das hat auch tiefe Probleme (die Periode reduzieren, Zeit, um neue Zahlen zu erzeugen, bis einer im richtigen Bereich ist, etc.) .
Ich denke, ich habe naiv dieses Problem angegangen. Es könnte an der Zeit sein, ernsthafte Forschung in der Literatur zu beginnen (jemand muss das schon einmal angepackt haben).
Sie können auch einen Blick auf java.util.Random.nextInt (int) werfen, die eine ziemlich clevere Methode verwendet, um das Ergebnis einzuschränken, ohne Bias einzuführen. Nahm mich über einen Tag, um zu verstehen, warum es funktioniert, obwohl :) – Joey
Wo ist diese Quelle verfügbar (Sorry, ich bin kein Java-Coder, ich weiß nichts darüber, wo die API ist) – DevinB
Zufällige Überprüfung ist keine gute Idee, aber wenn ich die Zahlen auf etwas überschaubares reduziere, kann ich jedes Ergebnis testen (siehe oben), und der Pseudocode ist tatsächlich voreingenommen. Jetzt muss ich durch Artikel gehen, die ich kaum verstehen werde, Seufzer. –