Cruz: seeehr viele Zufallszahlen erzeugen

Hallihallo,

ich habe gerade mit der Entwicklung einer Anwendung begonnen, die die Erzeugung von unglaublich vielen Zufallszahlen bedarf und es sollte natürlich auch möglichst schnell gehen. Ich mache mir Gedanken um die Grenzen der Zufallszahlengeneratoren, die mir zur Verfügung stehen.

Beispielsweise habe ich über die rand() Funktion in C die wage Aussage gelesen, dass sie etwa 2/3 von RAND_MAX viele Zufallszahlen erzeugen kann, bevor sie die Sequenz wiederholt und die Zufallszahlen wertlos werden. Wenn RAND_MAX nur ein 4 Byte grosser Integer ist, dann reicht das auf keinen Fall aus.

Wie ist es mit /dev/random und /dev/urandom? Sind sie besser als rand() und muss ich mir dann wegen der Laufzeit Sorgen machen?

Gruß,
Cruz

PS: Bitte keine "benutz doch Google" Antworten. Es geht mir hier um Meinungs- und Wissensaustausch und dafür ist so ein Forum ja da.

  1. Ich grüsse den Cosmos,

    Wie ist es mit /dev/random und /dev/urandom? Sind sie besser als rand() und muss ich mir dann wegen der Laufzeit Sorgen machen?

    Die Laufzeiten sind abhängig vom System und von der Umsetzung der Programmierung. Und ob du Probleme kriegst, hängt von der Hardware ab.

    Möge das "Self" mit euch sein

    --
    Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
  2. Hallo Cruz,

    Wie ist es mit /dev/random und /dev/urandom? Sind sie besser als rand() und muss ich mir dann wegen der Laufzeit Sorgen machen?

    Ich würde sagen, dass diese zur Laufzeit schneller laufen dürften als ein C-Programm mit rand().
    Aber /dev/urandom ist /dev/random vorzuziehen, da /dev/random bei zu geringerer Entropie blockiert (sprich: wenn keine qualitativ hochwertigen Zufallszahlen verfügbar sind).

    /dev/urandom arbeitet schneller und erzeugt auf meinem Rechner (Centrino 1,7 GHz) 34 MB Zufallsdaten in 10 Sekunden (getestet mit dem Befehl "dd if=/dev/urandom of=/dev/null", den ich nach 10 Sekunden abgebrochen habe).

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
  3. Hallo Cruz,

    Eine Sequenz von ca. 3 Mrd. Zahlen reicht Dir nicht?
    Was für eine Anwendung ist das?
    Es gibt sicher auch Generatoren, die mit 64 Bit arbeiten. Wenn Du echte Zufallszahlen nimmst, die auf irgend einer Entropie-Quelle basieren, sind die Sequenzen natürlich im Prinzip unendlich lang. Dafür ist es teuer, langsam oder beides solche Zufallszahlen zu erzeugen. Schon Pseudozufallszahlen können einen bedeutenden Rechenaufwand bedeuten, wenn man viele davon braucht.

    Schneller bekommt man Zufallszahlen idR. indem man einfach weniger benötigt. Bei vielen Anwendung wirft man ein großen Teil des "Zufalls" einfach weg, typisches Beispiel: if (rand() > 0.5)
    Da hat man 32 Zufallsbits für eine einzige Entscheidung.
    Du solltest also mal Deine Anwendung hier darlegen, vielleicht kommt man da auch mit weniger Zufallszahlen durch, auch wenn es nicht so offensichtlich ist, wie bei obigem Beispiel.

    Grüße

    Daniel