C: die endgültige Wahrheit über den rand, random und arc4random
Gibt es viele widersprüchliche Informationen zu diesem Thema. Lassen Sie uns also versuchen, sich auf eine definitive Antwort:
Denen eines dieser random number generator in C erstellen besser Zufälligkeit: rand, random oder arc4random?
Hinweis: um die Frage klar, das ist nicht eine Frage, über echte Zufälligkeit, es ist nur eine Auseinandersetzung zwischen den 3.
Als wies darauf hin, diese Frage macht nicht viel Sinn, denn es geht nicht um C, sondern um eine konkrete Umsetzung, in meinem Fall, Kakao (genauer gesagt mit dem iphone sdk, aber meine Vermutung ist, Sie sind die gleichen, soweit diese Funktionen gehen). Dennoch gibt es hier einige nützliche Informationen. Ich den Schluss, dass durch die Umsetzung von arc4random, vor allem wegen seiner Benutzerfreundlichkeit (kein seeding benötigt), das ist ein wichtiger Faktor, dass niemand darauf hingewiesen.
Ich schließe die Frage, und das hinzufügen der Kakao-tag für cocoa-Entwickler auf der Suche nach Informationen über RNGs. Vielen Dank für diejenigen, die beigetragen haben, und sorry für die Verwirrung.
Die Frage macht keinen Sinn. Nur rand() ist ein Teil der Sprache C, und die Norm sagen nichts darüber aus, wie zufällig es sein sollte oder wie es umgesetzt werden sollte.
Ja, klar ich Durcheinander. Es sollte vorgesehen nach unten zu Kakao. Also was jetzt? Dass der Umfang der Frage machen würde, die Antworten zu umständlich. Aber es gibt nützliche Informationen hier für cocoa-Entwickler, und schließen Sie die Frage schicken würde, die es alle auf die Vorhölle. Was ist zu tun?
InformationsquelleAutor Steph Thirion | 2008-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Funktionen, nur der rand ist Bestandteil des standard-C. random ist Teil von POSIX und arc4random nur in BSD (und abgeleitet). Also nur der rand ist "in C".
Für rand -, der C-standard sagt nichts über die Qualität des Generators, d.h. die Rücksendung immer die gleiche Zahl würde Stimmen. Er sagt, die Zahl muss zwischen 0 und RAND_MAX. Der Wert von RAND_MAX ist, und der präzise Algorithmus verwendet werden, sind die Umsetzung definiert (obwohl RAND_MAX muss mindestens 32767).
Für zufällige, POSIX gibt , es muss ein Zeitraum von mindestens 2^31 standardmäßig, und, wenn initstate genannt wird mit 256 bytes of state, dann muss er über einen Zeitraum von mindestens 2^69; weitere details sind wieder die Implementierung festgelegt.
Für arc4random, die spezifische Implementierung ist Teil Ihrer definition (RC4). Es ist angegeben, dass es 2^32 verschiedene Werte; ich konnte nichts finden über seine
Zeitraum.
Vergleichen Sie im detail, man müsste wissen, was die konkrete Umsetzung auf den Sie sich beziehen.
Wenn das iphone SDK ist ähnlich zu OSX, dann wird die rand () - Implementierung von FreeBSD (rand.c-1.15). Der Algorithmus ist dann von Parker und Mills, "Random number Generatoren: gute sind schwer zu finden". zufällig, dann verwendet den gleichen Algorithmus, wenn initstate ist n < 8; rand bereits einen guten Algorithmus
Ist die arc4random Algorithmus die gleichen in allen Implementierungen? Ich habe gelesen das es hier den besten Kakao: iphonedevelopment.blogspot.com/2008/10/... . Wie tut es vergleichen, die im Allgemeinen mit den anderen 2 in den meisten Implementierungen? Vielleicht können wir einen Konsens.
Ich denke, die blog-Artikel ist falsch. Es behauptet, dass, weil arc4random erzeugt 32-bit-statt 31, es gibt "viel mehr Präzision" - aber tatsächlich, es gibt nur ein zusätzliches bit. In einer typischen Anwendung, Sie brauchen nicht einmal 31 bits pro Anruf, aber viel weniger. Sowohl rand-und arc4random sind anständig.
Ich denke, es ist erwähnenswert an dieser Stelle, dass Apple man-Seite für
rand(3)
öffnet sich durch geradezu obsoletingrand
zu Gunsten vonarc4random
. Und die man-Seite fürrandom(3)
dem Schluss, dass Anwendungen in der Notwendigkeit von kryptografisch sicheren Zufälligkeit verwenden solltenarc4random
statt.InformationsquelleAutor Martin v. Löwis
Die Umsetzung von rand() nicht angegeben wird durch den C-standard, allerdings sind die meisten Compiler verwenden eine lineare congruential generator. random() und arc4random() sind nicht standard C, aber Sie sind besser als die übliche Umsetzung von rand()
Ich würde sagen: arc4random() ist besser als random() besser ist als rand()
rand() ist wirklich schrecklich. Könnte man leicht besser machen, als alle drei jedoch.
Es hängt auch davon ab, was Sie wollen, dass die Zufallszahlen für. Ein guter Zufallszahlengenerator für die Verschlüsselung/Sicherheit kann nicht sein, ein guter random number generator für die simulation und Umgekehrt.
InformationsquelleAutor Roland Rabien