Zufällige einmalige Zahl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zufällige einmalige Zahl

    Hallo zusammen,

    ich stehe mal wieder vor einem mir scheinbar unlösbarem Problem.

    Ich erstelle eine 5stellige zufällige Zahl mit srand etc. Nun möchte ich aber prüfen, ob diese bereits schon in der DB vorhanden ist und ggfs. dann eine neue erzeugen und diese wieder überprüfen usw. usw.

    Hat jemand eine Idee, mit welcher Art Schleife (denke doch mal, dass es darauf hinaus läuft) man das hinbekommen kann?

    Ich wäre dankbar für jeden Ansatz.

  • #2
    PHP-Code:

    $suchen 
    =  srand..... ;
    if ( 
    mysql_num_rowsmysql_query"SELECT daten FROM tabelle WHERE daten='$suchen'" ) ) != ) {
    echo 
    "Datensatz schon vorhanden"

    ungetestet

    Kommentar


    • #3
      Hallo nicker,

      ja soweit war ich auch schon mal. Habs im Eingangsposting vielleicht auch etwas ungeschickt erklärt, sorry.

      Zu deinem Teil. Wenn also ein Datensatz gefunden wird, soll automatisch eine neue Zahl generiert werden, BIS die generierte Zahl nicht in der DB gefunden wird.

      Die Generierung & Überprüfung soll quasi so oft wiederholt werden, bis kein Datensatz gefunden wird.

      Das ist mein Problem.

      Kommentar


      • #4
        while (!$found){
        $suchen = srand..... ;
        if ( mysql_num_rows( mysql_query( "SELECT daten FROM tabelle WHERE daten='$suchen'" ) ) != 0 ) {
        echo "Datensatz schon vorhanden"
        }
        else
        {
        echo "$nun haben wir ne Zahl";
        $found = "yes";
        }}

        Kommentar


        • #5
          Ich danke dir vielmals. Scheint so zu funktionieren, wie ich es mir dachte.

          Kommentar


          • #6
            Re: Zufällige einmalige Zahl

            Original geschrieben von Steven2k
            Hat jemand eine Idee, mit welcher Art Schleife man das hinbekommen kann?
            Ob die Abbruchbedingung am Anfang (while) oder am Ende (do-while) geprüft wird, die Schleife einen Zähler (for) führt oder ein Array als Zähler (foreach) fungiert, ist nur Komfort. Alle Schleifenkonstrukte sind äquivalent, denn sie bewirken nur einen Rücksprung vom Schleifenende an den Anfang (Assembler läßt grüßen).
            Die Frage "welche Schleife kann das" ist also sinnlos - mit der einen ist es schneller, mit der anderen übersichtlicher, aber alle können das gleiche.

            Kommentar


            • #7
              Mit "Art der Schleife" war in etwa "wie könnte die Schleife aussehen" gemeint.

              Kommentar


              • #8
                Hi

                Ich hab das gleiche problem und möchte diesen code hier gern benutzen nur möchte ich keinerlei ausgabe sondern wenn eine zahl schon vorhanden ist das eine neue generiert wird.

                Ich hab folgendes probiert:

                Code:
                        while(!$zahl)
                        {
                         $suchen = mt_rand(10000,99999);
                         if(mysql_num_rows( mysql_query( "SELECT id FROM tabelle WHERE zahl='".$suchen."'" ) ) == 0 )
                          {
                          $zahl= $suchen;
                          }
                        }
                aber irgendwie klappt das nicht

                Hans

                Kommentar


                • #9
                  Zitat von nussknacker Beitrag anzeigen
                  aber irgendwie klappt das nicht
                  Was genau daran klappt denn nicht? Bekommst du eine Fehlermeldung, gerätst du in eine Endlosschleife … Hellsehen kann hier leider niemand. Und deinen Code nun auszuführen würde ja auch vorkauen gleichen, da hat auch keiner Lust drauf. Also, ein paar Details mehr, bitte
                  [FONT="Helvetica"]twitter.com/unset[/FONT]

                  Shitstorm Podcast – Wöchentliches Auskotzen

                  Kommentar


                  • #10
                    Es scheint nichts zu passieren die seite läd und läd, es werden aber keine datenbank einträge vorgenammen.

                    Kommentar


                    • #11
                      Jetzt scheint es zu funktionieren ich habe einen fehler endeckt ich hatte statt ==0 immer noch !=0 stehen :-)

                      Kommentar


                      • #12
                        Das ist doch Wahnsinn!
                        Zufalls generierte Zahlen als Schleifenabbruchkriterium.
                        Ein Zufallsgenerator kann auch Monate lang die "falschen Zahlen" liefern. Unwahrscheinlich, ja, aber nicht unmöglich.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Ja katastrophale lösung! Als ersten auf jeden Fall in SELECT ein LIMIT 1 reinbauen!

                          Warum nutzt ihr denn Zufallswert nicht in Kombination mit einem Timestamp und besser noch mit einem Micro-Timestamp! Diese kann immer nur einmal vorkommen! Zur Sicherheit vielleicht noch in Kombination mit einem Zufallswert und da ist die wahrscheinlichkeit sehr hoch, das der Wert nur einmal vorhanden ist!

                          Kommentar


                          • #14
                            und dann noch als md5 => fertig

                            Kommentar


                            • #15
                              Je mehr Zahlen aus dem Bereich von 10000 bis 99999 bereits vergeben sind, desto mehr Versuche braucht dieser Code bis er eine freie Zahl findet. Das läuft also nur am Anfang gut.
                              Angenommen es wurde bereits die Hälfte aller Zahlen verbraten. Dann liegt die Chance eine freie Zahl zu finden bei jedem Versuch nur noch bei 50%. Bei Gleichverteilung der Zufallswerte, die mt_rand() liefert, brauchst du also im Schnitt 2 Versuche. Sind 75% aller Zahlen vergeben, brauchst du 3 Versuche, wenn nur noch eine Zahl frei ist, brauchst du 90.000 und wenn gar keine mehr frei ist, ist es eine Endlosschleife! Der Ansatz ist also totaler Müll, sorry. Alternativen wurden dir bereits genannt.

                              Übrigens ist zahl sicher eine numerische Spalte, sollte es jedenfalls sein und damit sind die Anführungszeichen in der Query nicht korrekt.

                              Kommentar

                              Lädt...
                              X