Ich benötige eine Funktion, die eine zufällige Ganzzahl in einem bestimmten Bereich (einschließlich Randwerten) generiert. Ich habe keine unangemessenen Qualitäts- / Zufallsanforderungen, ich habe vier Anforderungen:
- Ich brauche es, um schnell zu sein. Mein Projekt muss Millionen (oder manchmal sogar Dutzende Millionen) Zufallszahlen generieren, und meine aktuelle Generatorfunktion hat sich als Engpass erwiesen.
- Ich brauche es, um einigermaßen einheitlich zu sein (die Verwendung von rand () ist vollkommen in Ordnung).
- Die Min-Max-Bereiche können zwischen <0, 1> und <-32727, 32727> liegen.
- es muss siedbar sein.
Ich habe derzeit folgenden C ++ - Code:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Das Problem ist, dass es nicht wirklich einheitlich ist - max wird nur zurückgegeben, wenn rand () = RAND_MAX ist (für Visual C ++ ist es 1/32727). Dies ist ein großes Problem für kleine Bereiche wie <-1, 1>, in denen der letzte Wert fast nie zurückgegeben wird.
Also griff ich nach Stift und Papier und fand die folgende Formel (die auf dem ganzzahligen Rundungstrick (int) (n + 0,5) aufbaut):
Aber es gibt mir immer noch keine gleichmäßige Verteilung. Wiederholte Läufe mit 10000 Proben ergeben ein Verhältnis von 37:50:13 für die Werte -1, 0,1.
Könnten Sie bitte eine bessere Formel vorschlagen? (oder sogar ganze Pseudozufallszahlengeneratorfunktion)