2010-12-14 18 views
4
int randomNumber = (arc4random() % 83) + 1; 

Ist dies der beste Weg, "die am meisten zufällige" Zahl zu generieren? Oder gibt es eine bessere Möglichkeit, eine Zufallszahl zu generieren?arc4random Zufallsgenerator

+0

Sie können diese Frage beziehen: http://stackoverflow.com/questions/3724526/how-to-generate-random-number-from-0-5-to-1-0/3724668#3724668 –

Antwort

9

arc4random hat einen besseren Algorithmus zum Generieren von Zufallszahlen basierend auf der aktuellen Zeit. Es gibt andere rand-Funktionen, aber sie sind nicht so gut und erfordern Seeding.

+3

'arc4random' erfordert auch das Säen, es sät nur sich selbst vor dem ersten Gebrauch. – Joey

+1

überlegen was? –

+0

Rand und ähnliche Funktionen, die nicht so breit wie arc4random sind – prgmast3r

13

Wenn Sie arc4random Sie vermeiden eine Gefahr von % mit linearen Kongruenz Generatoren (die die üblichen Algorithmus von rand verwendet wird): Die Bits niedriger Ordnung sind nicht weniger zufällig.

Allerdings haben Sie immer noch Trunkierungsprobleme: zB weil (1 << 32) % 83 77 ist, bedeutet dies, dass Zahlen zwischen 0 und 76 (etwas) häufiger erscheinen als Zahlen zwischen 77 und 82. Um dies zu vermeiden, sollten Sie die eingehenden wegwerfen Wert (dh, rufen Sie wieder arc4random), wenn es über (1 << 32)/83 * 83 ist.

(ich nehme das Angebot an arc4random von 0 bis 2 ist -1. Entsprechend der obigen Erläuterung anpassen.)

+1

@Joe Blow: Das OP fragte nach dem "besten" System zur Erzeugung von Zufallszahlen, das normalerweise verfügbar ist, also antwortete ich darauf. Außerdem ist 'arc4random' fantastisch: Es nutzt die vom Kernel gesammelte Entropie und all das gute Zeug. –

+1

@Joe Blow: Eigentlich ist 'arc4random' eine kryptographische Zufälligkeit. Es entspricht dem Lesen von '/ dev/arandom'. Sie könnten es also für Crypto-Grade-Kram verwenden, wenn Sie mit der Zufälligkeit richtig umgehen (und die Ergebnisse nicht unwissentlich verfälschen, indem Sie die von mir erwähnte Überprüfung nicht durchführen). –

+0

Es gibt jetzt eine Reihe von bekannten Voreingenommenheiten in arc4. Zum Beispiel http://www.worldlingo.com/ma/enwiki/de/RC4 "Der von der RC4 erzeugte Schlüsselstrom ist in unterschiedlichem Maße auf bestimmte Sequenzen ausgerichtet." Aus diesem Grund können Sie arc4 beispielsweise nicht für wissenschaftlich wichtige MC-Sims verwenden. – Fattie

2

Die beste Generator Zufallszahl ich je gesehen habe (wie auch eine sehr klare Definition von was Zufall bedeutet) kann in Stephen Wolfram's Eine neue Art der Wissenschaft gefunden werden. Er verwendet seit Jahrzehnten in seinem Mathematica-Programm einen sehr einfachen zellulären Automaten als Zufallsgenerator, so dass er sehr gut getestet wurde.