Zufall beeinflussen

=fire=

Erfahrenes Mitglied
Moin,

ich würde gerne was per Zufall ausführen lassen...

Es soll jede Stunde da Script per Cronjob ausgeführt werden... In dem Script bekommt ein User, die Id wird durch Rand ausgelost, eine Aufgabe. Die Aufgaben stehen in der MySql und haben Frequenzen das bedeutet frequenz 10 sehr oft frequenz 1 sehr selten..

Wie mache ich das ambesten das die mit Frequenz 10 & 9 öfters zugeweisen werden als die mit frequenz 1.
 
Hallo,
ich würde es so machen:

1+2+3+4+5+6+7+8+9+10 = 55 (alle möglichen Frequenzen aufaddiert)

Du generierst also Zufallszahlen von 1-55.
Danach entscheidest du je nachdem welche Zahl kommt, welche Frequenz die Frage aus der Datenbank haben soll:
PHP:
$zahl = rand(1,55);

if ($zahl==1) $freq = 1;
else if ($zahl==2 || $zahl==3) $freq=2;
else if ($zahl>=4 && $zahl<=6) $freq=3;
else if ($zahl>=7 && $zahl<=10) $freq=4;
//...
else if ($zahl>=46 && $zahl<=55) $freq=10;
Danach holst du alle Fragen mit der entsprechenden Frquenz aus der DB und musst dann evtl wieder durch Zufall bestimmen, welche von diesen Fragen genommen wird.
 
Ein Lösungsansatz ist es ohne große Recheneien einfach die Fragen virtuell anhand der Frequenz zu vervielfachen um dann die warscheinlichkeit das eine Solche Frage ausgewählt wird zu erhöhen. Sieht dann so aus:

PHP:
<?
$fragenkatalog[] = array('id' => 1, 'freq' => 3, 'frage' => '1+2=?');
$fragenkatalog[] = array('id' => 2, 'freq' => 1, 'frage' => '2*2=?');
$fragenkatalog[] = array('id' => 3, 'freq' => 9, 'frage' => '4*4=?');
$fragenkatalog[] = array('id' => 4, 'freq' => 7, 'frage' => '123/282=?');

$fragen = array();

// Ersetzt den Datenbankteil hier zur Demonstration
foreach ($fragenkatalog as $row){
    // Frage vervielfachen, anhand der Frequenz
    for ($i=0;$i<$row['freq'];$i++){
        $fragen[] = $row;
    }
}
shuffle($fragen);


// Nun Fragen auf zufällige Indices zugreifen.
// Aufgrund der häufungen der Fragen sind die mit
// erhöhter Frequenz warscheinlicher geworden

for ($i=0;$i<20;$i++){
    $x = rand(0,(count($fragen)-1));
    echo $fragen[$x]['frage']."\n";
}
?>

ist aber auf jeden Fall nur ein Ansatz
 
Zurück