verteilung von order by rand()

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

  • verteilung von order by rand()

    Hallo,

    vorab: Ja ich habe die Suche benutzt;-) Es sind zwar einige Themen zum Thema rand() vorhanden aber keins war wirklich hilfreich...

    Worum gehts:

    Ich habe eine Tabelle mit einzelnen Wörtern (momentan ca. 250 Einträge).

    Zu jeden Wort soll eine Relation zu n zufälligen Wörtern aus der gleichen Tabelle hergestellt werden. Diese Relationen müssen jederzeit genauso wieder hergestellt werden.
    Ist ja eigentlich keine grösse Übung:



    PHP-Code:
      while($row mysql_fetch_array($key_queryMYSQL_ASSOC)) {
        
    $keyword $row['keyword'];
        
    $rand_result mysql_query("SELECT keyword FROM keywords ORDER by rand('".md5($keyword)."') LIMIT 15");
        while(
    $rand_row mysql_fetch_array($rand_resultMYSQL_ASSOC)) {
          
    $rand_keyword =  $rand_row['keyword'];
        }
      } 
    damit habe ich zu jedem $keyword n(Bsp: 15) $rand_keywords.

    Nach Adam Riese und Eva Zwerg sollte jedes $rand_keyword ungefähr gleich oft getroffen werden (in diesen Fall ca. 15). Tut es aber nicht :-(
    Das häufigste wird > 130 mal getroffen das seltenste 1-3 Mal (Bei einer Tabellegröße von ca. 250).

    Getestet habe ich das sowohl unter WIN2000 mit MySQL 4.0.15 als auch unter Linux mit MySQL 3.23.57. In beiden Fällen eine ähnlich schlechte Verteilung.

    Hat jemand eine Idee ob und wie ich eine bessere Verteilung bekomme? Der einzige Ansatzpunkt wäre IMHO der übergebene RAND_SEED. Dieser muss auf jeden Fall mit einem Wert belegt werden den ich jederzeit wiederholen kann, um die Relationen immer wieder gleich zu bekommen. NOW() fällt somit aus. Ausserdem wird dadurch die Veteilung auch nicht besser, habe ich bereits getestet.

  • #2
    Wer lesen kann ist klar im Vorteil:

    RAND(N)
    Returns a random floating-point value in the range 0 to 1.0. If an integer argument N is specified, it is used as the seed value (producing a repeatable sequence).

    Also schwupps mal 'ne Ganzzahl berechnet:

    $query = "SELECT keyword FROM keywords ORDER by rand('".abs(crc32($keyword))."') LIMIT 15";

    Jetzt ist es etwas besser: Verteilung von 6 bis 26. Reicht mir aber noch nicht.
    Jemand vielleicht eine Idee?

    Kommentar


    • #3
      mir ist gerade noch nicht so ganz klar, was du erreichen willst. kannst du mal einen Fall als beispiel geben?

      Kommentar


      • #4
        Also:

        zu jedem Wort aus der Liste sollen zufällig z.B. 15 Wörter zugeordnet werden:

        Wasser:
        Bier, Pferd, Stuhl, Papier...


        Stuhl:
        Fernseher, Buch, Tisch, Kanne...


        Bei jedem Wort sollen immer die gleichen Zufalllsergebnisse auftauchen, deshalb brauche ich für jedes Wort einen reproduzierbaren einen RAND_SEED.

        PHP-Code:

        $key_query 
        mysql_query("SELECT keyword FROM keywords");
            
        while(
        $row mysql_fetch_array($key_queryMYSQL_ASSOC)) {

            
        $keyword $row['keyword'];
            
        $rand_result mysql_query("SELECT keyword FROM keywords ORDER by rand('".abs(crc32($keyword))."') LIMIT 15");
            while(
        $rand_row mysql_fetch_array($rand_result)) {
                
        $rand_keyword =  $rand_row['keyword'];
            }
            

        in der äusseren Schleife hole ich mir alle Wörter, in der inneren zu jedem Wort die 15 Zufallstreffer.
        Insgesamt sollte jedes Wort in den Zufallstreffer gleich häufig auftauchen. Nur klappt das leider nicht.

        Hoffe es ist etwas klarer geworden.

        Kommentar


        • #5
          ich wüsste nicht, wie ein ergebnis mit RAND reproduzierbar sein sollte.

          Kommentar


          • #6
            Sehe gerade das im ersten Beitrag der PHP-Schnipsel nicht vollständig war, sorry.

            Kommentar


            • #7
              Hi,

              ich wüsste nicht, wie ein ergebnis mit RAND reproduzierbar sein sollte.
              So wie bei fast jeder rand()-Funktion: Wenn mit dem gleichen SEED initialisiert wird kommen auch immer die gleiche Zufallszahlen raus.
              Ist übriges bei PHP nicht anders.

              Kommentar


              • #8
                Ist übriges bei PHP nicht anders.
                Hmm, in PHP braucht rand 2 (optionale) parameter. und rand liefert in dem fall nur eine zufallszahl zwischen den beiden werten zurück. und zwar jedes mal eine andere.

                für SQL hast du allerdings recht. da kommt bei ein und dem selbern seed auch immer der gleiche wert zurück.

                bei mir kommen allerdings auch immer die gleichen results zurück...
                Zuletzt geändert von TobiaZ; 07.11.2003, 22:11.

                Kommentar


                • #9
                  Erstmal danke das du dich damit auseinandersetzt!

                  Auch in PHP habe ich recht ;-), nur wird hier der SEED mit srand ( int seed) gesetzt... Nur so nebenbei...

                  Ich schau mal ob PHP eine bessere Verteilung macht. Finde ich zwar extrem unschön aber vielleicht bleibt mir ja nix anderes übrig :-(

                  Kommentar


                  • #10
                    du sagst es. srand() hab ich voll nicht mehr beachtet. jetzt wo dus sagst. ich nehm alles zurück und behaupte das gegenteil. man sollte den leuten glauben, die sich akut mit dem thema beschäfftigen.

                    naja, wie gesagt. bei mir in der Testumgebung lief das eben sogar ziemlich gut. kann das problem deswegen leider nicht nachvollziehen. und nach deinen erklärungen sehe ich auch keine logik dahinter.

                    Kommentar


                    • #11
                      Naja, ein Versuch war es wert.
                      Wenn ich das ganze mit PHP nachbilde (Schleife n-mal jedesmal einen Zufallsdatensatz mit LIMIT mt_rand(0, anzahlDatensaetze-1) , 1 ) kommt eine ganz ähnliche Verteilung wie mit SQL raus. Ist euch egal ob ich rand oder mt_rand nutze. Da sich die Verteilungen _sehr_ähnlich sind gehe ich davon aus das die Funktionen nach einen ähnlichen Algorithmus arbeiten. Die Verteilung liegt also vermutlich an den generierten RAND_SEEDs. Ich werde da mal noch bisschen mit rumspielen.

                      Kommentar


                      • #12
                        Ist euch egal ob ich rand oder mt_rand nutze.
                        Eigentlich schon

                        Mehr kann ich nicht sagen. muss dringend in die pofe...

                        Kommentar

                        Lädt...
                        X