Frage

Ein spezielles Beispiel

Ich brauche eine Zufallszahl zwischen 0 und einschließlich 2 zu erzeugen. (Oder wählt zufällig zwischen -1, 0 und 1).

Der naive Ansatz wäre so etwas wie rand() mod 3 zu tun, wo rand() eine ganze Zahl zurückgibt. Dieser Ansatz erzeugt keine statistisch Zufallszahl, wenn die oberen von rand() gebunden nicht relativ prim ist (und die untere Grenze 0).

Zum Beispiel rand unter der Annahme () ergab 2 Bits (von 0 bis einschließlich 3), würde die Modul Karte:

0 -> 0
1 -> 1 | 2 -> 2
3 -> 0

Diese Schrägstellung in Richtung 0 wäre natürlich viel weniger, wenn mehr Bits zurückgegeben werden würden, aber egal, würden die Skew bleiben.

Die allgemeine Frage

Gibt es eine Möglichkeit, um eine gleichmäßig verteilte Zufallszahl zwischen 0 und der Erzeugung von n-1, einschließlich, wobei n 2 relativ prim ist,?

War es hilfreich?

Lösung

Ein gemeinsamer Ansatz ist Zufallswert über dem letzten vollständigen Zyklus zu verwerfen, und nur für eine neue Zufallszahl stellen.

Andere Tipps

Es könnte Ihren rand () Obergrenze Hilfe bei der Wahl sein k * n wobei k eine ganze Zahl ist. Auf diese Weise wird das Ergebnis gleichmäßig vorgesehen verteilt wird, dass rand () ist ein guter Zufallsgenerator.

Wenn es nicht möglich ist, die Obergrenze zu reduzieren, können Sie k zu wählen, so dass k * n so nahe rand () ist Ober wie möglich gebunden und die Ergebnisse über diese Nummer verwerfen es erneut versuchen.

Siehe meine Antwort auf eine ähnliche Frage.

Im Grunde verwenden Ihre RNG und entsorgen Sie alles über N und versuchen Sie es erneut. Zur Optimierung können Sie mod verwenden, und entsorgen Sie alles über n * Boden (MAX / n)

Allg Antwort: Sie brauchen mehr zu verwenden, als nur 2 Bits der Zahl.

Faust Meine Regel ist Gleitkommawerte zu erzeugen, x , 0,0 <= x <1,0 multiplizieren mit 3 und gestutzt. Das sollten Sie Werte im Bereich von 0 erhalten, 1 und 2, die auf eine größere Anzahl von Bits ab.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top