Ferage zur Erzeugung von Zufallszahlen

  • Hallo,


    ich bringe mir gerade selber PHP anhand von Büchern bei.


    Nun schreibt ein Autor, dass zur Erzeugung von Zufallszahlen für die Initialisierung die Funktionen srand() und microtime() eingesetzt werden.


    Die Funktion rand() ist mir bekannt.


    Aber was bedeutet srand() und warum wird die Systemzeit dafür benötigt?


    Im Buch wird das so aufgeführt:


    srand((double)microtime()*1000000);


    Vielleicht kann mir ja jemand erklären wie das zusammenhängt.


    Vielen dank

  • Mittels rand wird eine ganzzahlige (79 oder 83 oder 30 ...) Zufallszahl aus dem Zahlenpool von 1 bis 100 ausgewählt.



    Bevor der Zufallszahlengenerator genutzt werden kann, muss er zunächst mit einem Startwert – dem sogenannten Seed – initialisiert werden, was mit srand geschieht. Als Seed benutzt man hier die Systemezeit. Seit PHPO 4.xx geschieht dies zwar automatisch, aber man macht dies zur Sicherheit dennoch immer noch.

  • Hi Visierrunter,


    um das mit der Systemzeit oder dem Seed zu verstehen, muss man wissen, wie Zufallszahlen in Computern / Programmen erzeugt werden. Das Problem ist, das Computer sehr gut Sachen berechnen und dabei immer das gleiche Ergebnis produzieren. Was Computer nicht können, ist etwas "Zufällig" zu erzeugen. Also nutzt man hier auch Berechnungen.


    Wenn man etwas wie rand() aufruft läuft im Hintergrund eine Berechnung los mit srand() kann man den Random-Generator "seeden". Anhand des Seeds wird die Zufallszahl berechnet. D.h. wenn man immer den gleichen Seed einträgt, bekommt man immer die gleichen "Zufallszahlen" (welche damit dann nicht mehr zufällig wäre). Damit man vorher nun schwerer weiß, welche zufällige zahl herauskommt, versucht man beim Aufruf jedesmal einen anderen seed mit zu geben. Etwas das sich dafür eignet ist die Systemzeit in Millisekunden, da diese ja "jede" Millisekunde anders ist. (wenn man srand() vorher nicht aufruft, nutzt die Funktion rand() die System zeit im Standard).


    Um das zu testen:


    PHP
    1. <?php
    2. $r = srand(123);
    3. echo rand()."<br/>";
    4. echo rand()."<br/>";
    5. echo rand()."<br/>";
    6. ?>

    Wird immer folgende Ausgabe liefern:


    Code
    1. 1495656191
    2. 1531059894
    3. 614479551


    Da der Seed am Anfang der gleiche ist (Man bekommt zwar nach jedem Aufruf von rand eine andere zufällige zahl, aber diese zufälligen zahlen bleiben in der Reihenfolge gleich).


    Nun stellen sich zwei Möglichkeiten:

    1. Ich will vorher nie wissen welche zufällig zahl ich bekomme, deshalb seede ich rand() jedesmal mit einen neuen wert (z.B. der Systemzeit).

    2. Ich möchte immer die gleichen Zufallszahlen (in der Reihenfolge) erzeugen also nutze ich z.B. die ID des Users (Ein einfaches beispiel ist hier schwer, aber nehmen wir z.B. Computer-Spiele, welche Zufällig generierte Karten haben, wenn ich einen Seed selbst angeben kann, bekomme ich zwar immer eine zufällige karte, aber ich kann diese immer wieder gleich generieren, was z.B. ein vorteil ist, wenn ich dies mit anderen Leuten teilen möchte).


    Grüße


    Timo