Armin Plöger: Zufällige zahlen von MYSQL erstellen lassen

Hallo, ich habe ein Problem mit einem Script, ich habe vor Ein Kleines Lottoscript zu schreiben für ein Spiel. Dabei soll es Genauso wie im Richitgen lotto möglichsein das die Leute die zahal 1-46 nutzen können und insgesamt 6 Zahlen je Lottoreihe.

Damit man im Verhältniss eine Grössere Chance zu haben auch was zu gewinnen habe ich es nun so gemacht das man durch ein Automatisches script sagen kann man möchte auf einen Schlag 3000 Lottoreihen Spielen (die anzahl wird begrenzt durch die menge an Credits die man hat)

Jetzt habe ich in PHP ein script welches mit einen zahlen array liefert mit 6 zufällig nicht identischen zahlen. Wenn ich das Script jedoch durchlaufe lasse mit 10 Zahlen ist alles Okay, bei 50 auch noch dann fängt es langsam an schwer zu werden und das Script bricht einfach ab.

for ($i=1; $i<=$_POST['menge']; $i++) {
 //Letzte abgegebene Lottoschein Zahl
 $sql = " INSERT INTO lotto\_zaehler ( von )
          VALUES  ( '".$i."' )";
 mysql_query($sql);
 $lastid = mysql_insert_id();
 for ($rand_zahlen = array(rand('1', '46'), rand('1', '46'),rand('1', '46'),rand('1', '46'),rand('1', '46'),rand('1', '46')); check_double($rand_zahlen); $rand_zahlen = array(rand('1', '46'), rand('1', '46'),rand('1', '46'),rand('1', '46'),rand('1', '46'),rand('1', '46'))) { }

$sql  = "INSERT INTO lotto\_zahlen  ( schein\_id   , zahl    , tag     , uni      )

// das nachfolgende wiedehole ich 6 mal je einzelne zahl ist nur gekürzt zum besser lesen          VALUES ('".$lastid."', '".$rand_zahlen[0]."' , '".$_POST['tag']."' , '".$daten_user['uni']."' );
     ";
 mysql_query($sql);
}

Das ergebniss was dann in die MYSQL Datenabnk geschrieben wird siht ähnlich dem hier aus ->

schein_id  zahl
1         15
1        41
1        14
1        11
1        37
1         6
2        14
2         17
2        26
2        24
2        12
2         40

Wie kann ich den Auftrag des das X Zahlenkombinationen automatisch von der MYSQL datenbank übernommen werden und die MYSQL Datenbank den auftrag abbarbeitet ?
Was mir selber aufgefallen ist das diese Kommunikation zwischen PHP und MYSQL bei der anzahl aufrufe und einträge nicht so gut funktioniert.

Die auswertung mache ich dann Später über

SELECT count( * ) , schein_id
FROM lotto_zahlen
WHERE zahl
IN ( 23, 12 , 16 , 34 , 7 , 11)
GROUP BY schein_id

Ich hoffe ihr Könnt mir helfen

Gruss Armin

  1. mach keine schleifen die hundert abfragen hintereinander ausführen - speichere alle abfragen in einen string (oder ein textfile) und führe dann alle abfragen gleichzeitg aus

    alternativ: verlagere so viele funktionen wie möglich (zb die berechnung von zufallszahlen) direkt in die datenbank
    http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand

    1. Hallo Suit,

      Ja, ich wollte ja das erstellen der Zuffalsfahlen von der Datenbank übernehmen lassen nur wie schaffe ich das das die Datenbank von sich aus

      6 Einträge in lotto_zahlen macht ? und diese 6 Zahlen dürfen sich nicht wiederholen, also nicht das dann da drin steht 4 5 6 7 5 4 jede zahl darf bei den 6 einträgen nur einmal vorhanden sein.

      1. Hello,

        6 Einträge in lotto_zahlen macht ? und diese 6 Zahlen dürfen sich nicht wiederholen, also nicht das dann da drin steht 4 5 6 7 5 4 jede zahl darf bei den 6 einträgen nur einmal vorhanden sein.

        es gäbe da immer noch folgende Lösung, einfach, aber vielleicht nicht besonders schön:

        1. Erstellt eine Tabelle kandidaten, in der du die Zahlen von 1..46 speicherst.
        2. Führe eine Abfrage SELECT ... FROM kandidaten ORDER BY RAND() LIMIT 6 durch
          Es ist gewährleistet, dass (1) die Zahlen aus dem Wertebereich kommen und (2) nicht doppelt vorkommen.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
        1. Hallo Rouven,

          nur wenn ich das mache habe ich ja auch wieder das Problem das die Daten erst wieder in PHP verarbeitet werden und dann wieder von PHP nach MYSQL müssen

          1. Hallo

            nur wenn ich das mache habe ich ja auch wieder das Problem das die Daten erst wieder in PHP verarbeitet werden und dann wieder von PHP nach MYSQL müssen

            wo ist das Problem, daraus ein INSERT-Statement zu bauen, d.h.

            INSERT INTO ...  
            SELECT ...
            

            Und wo ist das Problem, mindestens MySQL 5.x vorausgesetzt, dies in einer Stored Procedure 3000-mal je Aufruf durchzuführen?

            Freundliche Grüße

            Vinzenz

  2. Hello,

    warum arbeitest Du nicht mit http://de3.php.net/manual/en/function.shuffle.php?

    Ein Array mit den Zahlen
    Durcheinanderbringen mit shuffle()
    die ersten sechs auslesen
    fertig!

    <?php  ### sechs_aus_49.php ###

    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());
        return ((float)$usec + (float)$sec);
    }
    #------------------------------------------------------------------------------

    $time_start = microtime_float();
    $_zahlen = array();

    for ($i = 1; $i < 50; $i++)
    {
      $_zahlen[] = $i;
    }

    echo "<pre>\r\n";

    for ($i = 1; $i <= 3000; $i++)
    {
      shuffle($_zahlen);
      echo $_zahlen[0], "\t", $_zahlen[1], "\t", $_zahlen[2], "\t", $_zahlen[3], "\t", $_zahlen[4], "\t", $_zahlen[5], "\t", "ZZ = ", $_zahlen[6], "\r\n";
    }

    echo "</pre>\r\n";

    $time_end = microtime_float();
    $time = $time_end - $time_start;

    echo "<p style="margin-top:9pt;">Berechnungszeit: $time Sekunden</p>\n";

    ?>

    Das Script liegt zum Testen unter http://selfhtml.bitworks.de/spiele/6aus49/6aus49.php

    Berechnungszeit für 3000 Datensätze 0,19 Sekunden!

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Hi,

    Dabei soll es Genauso wie im Richitgen lotto möglichsein das die Leute die zahal 1-46 nutzen können

    Btw: "Richtiges Lotto" ist, zumindest nach deutschem Maszstab, "6 aus 49".

    MfG ChrisB

    --
    "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."