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;
$ende = 50;
$anzahl = 100000;
$results = array();
for($i = $start; $i < $ende; $i++) {
$results[$i] = 0;
}
for($i = 0; $i < $anzahl; $i++) {
$zufall = mt_rand($start, $ende - 1);
$results[$zufall]++;
}
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:
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