Vinzenz Mai: mt_rand()

Beitrag lesen

Hallo,

PHPs rand() hat doch mit MySQLs RAND() überhaupt nichts zu tun!
und mt_rand() sowieso nicht.

Mag sein, Schornsteinfeger und Ferkel haben auch nichts miteinander zu tun. Gemeinsam ist ihnen, dass sie mein Problem nicht lösen konnten. MySQLs RAND() bezog sich auf die Verlinkung zu meinem alten Faden, damit begann es.

ich kenne Deinen alten Thread, auch wenn ich mich selbst nicht daran beteiligt habe :-)

Schau' Dir doch einfach mit folgendem Skript die Verteilung der Zufallszahlen an:

  
<?php  
    header("Content-Type: text/plain");  
  
    $start = 0;          // kleinste Zufallszahl  
    $ende  = 50;         // größte Zufallszahl plus 1 :-)  
    $anzahl = 100000;    // Wie oft "würfeln" wir.  
                         // Sollte sehr viel größer als die Anzahl der  
                         // unterschiedlichen Werte sein  
  
    // initialisiere das Array für die Statistik  
    $results = array();  
    for($i = $start; $i < $ende; $i++) {  
        $results[$i] = 0;  
    }  
  
    for($i = 0; $i < $anzahl; $i++) {  
        // wir wollen die obere Grenze nicht mitnehmen.  
        $zufall = mt_rand($start, $ende - 1);  
        $results[$zufall]++;  
    }  
  
    // Ausgabe der Statistik  
    foreach ($results as $key => $value) {  
        echo $key, " kommt ", $value, "-mal vor.\n";  
    }  
?>

Ich finde die Verteilung annehmbar ausgeglichen, ganz besonders wenn man mít verschiedenen Werten für $anzahl experimentiert.

Und nun kannst Du ganz einfach wie folgt vorgehen:

a) Ermittle die Anzahl der Datensätze, die Deine Abfrage zurückliefern würde,
   z.B. mit
   SELECT SQL_CALC_FOUND_ROWS <Rest Deiner Abfrage> und anschließendem
   SELECT [link:http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows@title=FOUND_ROWS()]

b) Ermittle nun mit PHP Deine Zufallszahl zwischen 0 und der Anzahl der
   Datensätze (ausschließlich der oberen Grenze)

c) Frage nun den gewünschten Zufallsdatensatz mit
     SELECT <Rest Deiner Abfrage> LIMIT <zufallszahl>, 1
   ab.

Du bekommst die Güte der Gleich- und Zufallsverteilung der PHP-Funktion, sparst Deinem DBMS das völlig überflüssige Sortieren der Ergebnismenge und fragst trotz alledem nur einen einzigen Datensatz ab.

Einen eigenen Zufallszahlengenerator zu schreiben, lohnt in aller Regel nicht (ja ja, hab' ich auch schon gemacht ... in Pascal auf 'nem Mainframe unter BS2000 - lange vor BS2000/OSD ...)

Freundliche Grüße

Vinzenz