langeweile - zufallszahlen-contest

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

  • langeweile - zufallszahlen-contest

    ja, könnte auch ins ot rein - hier ist ja nichts los

    habe mal ein altes script von mir rausgekramt.

    gesucht: 5 eindeutige zufallszahlen zwischen 1 und 15
    bedingung: maximale performance bei z.b. 10.000 schleifendurchläufen


    wer hat ein schnelleres script?
    PHP-Code:
    function getmicrotime(){
        list(
    $usec$sec) = explode(" ",microtime());
        return ((float)
    $usec + (float)$sec);
        }

    // Stoppuhr anschmeißen
    $time1=getmicrotime();

    // CODE ========================================================================
    $i=0;
    while(
    $i<10)
     {
      
    $i++;
      
    $k=0;
      while(
    $k<10000)
       {
           
    $k++;
           
    // Zufallszahlen-Generator initialisieren
           
    srand((double)microtime()*1000000);

           
    // Auf gut Glück fünf Zufallszahlen generieren
        
    $r0=rand(1,15);
        
    $r1=rand(1,15);
        
    $r2=rand(1,15);
        
    $r3=rand(1,15);
        
    $r4=rand(1,15);
        
        
    // Nach dieser While-Schleife sind die ersten drei Zufallszahlen eindeutig
        
    while($r0==$r1||$r1==$r2||$r0==$r2)
         {
          
    $r0=rand(1,15);
          
    $r1=rand(1,15);
          
    $r2=rand(1,15);
         }
         
        
    // Nach dieser While-Schleife sind die ersten vier Zufallszahlen eindeutig
        
    while($r0==$r3||$r1==$r3||$r2==$r3)
         {
          
    $r3=rand(1,15);
         }

        
    // Nach dieser While-Schleife sind alle Zufallszahlen eindeutig
        
    while($r0==$r4||$r1==$r4||$r2==$r4||$r3==$r4)
         {
          
    $r4=rand(1,15);
         }
       }
      
    // Mal testweise den ganzen Müll ausgeben (10.000 Durchläufe)
      
    echo "$r0$r1$r2$r3$r4 <br>";
     }
    // =============================================================================

    // Stoppuhr stoppen (wie schon der Name sagt) 
    $time2=getmicrotime();

    // Die fantastische Laufzeit des genialen Algorithmus ausgeben
    echo "<br>RUNTIME: ";
    echo 
    $time2-$time1

  • #2
    ohje

    PHP-Code:
    $vals array_rand(range(0,14,1), 5); 
    ... um meine ausgabe mit deiner identisch zu gestalten, müsste man die zufallswerte zum schluss noch um eins inkrementieren. array_rand gibt die _schlüssel_ des arrays zurück, und nicht die werte selbst - wenn ich mit 0 zu zählen anfange, sind schlüssel und werte in diesem fall identisch und man spart sich einen durchlauf.

    srand ist im übrigen seit 4.2.0 obsolet.
    Zuletzt geändert von axo; 27.09.2006, 00:56.

    Kommentar


    • #3
      Original geschrieben von axo
      ohje

      PHP-Code:
      $vals array_rand(range(0,14,1), 5); 
      ... um meine ausgabe mit deiner identisch zu gestalten, müsste man die zufallswerte zum schluss noch um eins inkrementieren.
      neee
      man macht einfach range(1,15)
      in jedem fall ist deine Version einwenig kürzer als bei 3DMax.
      getestet habe ich es nicht, aber ich glaube, dass es auch schneller ist.
      Slava
      bituniverse.com

      Kommentar


      • #4
        Original geschrieben von axo

        srand ist im übrigen seit 4.2.0 obsolet.
        wie gesat, das script ist älter.
        array_rand ist mehr als doppelt so schnell!

        Kommentar


        • #5
          Original geschrieben von Slava
          neee
          man macht einfach range(1,15)
          nein: http://de3.php.net/array_rand
          If you are picking only one entry, array_rand() returns the key for a random entry. Otherwise, it returns an array of keys for the random entries.
          führt in unserem fall dazu, dass auch bei range(1,15) die 0 als wert zugelassen wird.

          Kommentar


          • #6
            wobei:

            PHP-Code:
            $bla range(0,15);
            unset(
            $bla[0]);
            $vals array_rand($bla5); 
            ... jetzt passts. alle werte von 1 bis 15 ...

            Kommentar


            • #7
              ich bin davon ausgagengen, dass man sowieso ausgabe mit echo machen muss.
              PHP-Code:
              $a=range(1,15);
              $v=array_rand($a5);
              //kann man auch ohne schleife $a[$v[0]] ...
              foreach($v as $v){echo $a[$v].",";} 
              Slava
              bituniverse.com

              Kommentar


              • #8
                foreach($v as $v) ???!
                na was geht daran nicht?

                Kommentar


                • #9
                  Original geschrieben von Trashar
                  foreach($v as $v) ???!
                  na was geht daran nicht?
                  Das würde ich auch mal gerne wissen.....
                  (Dir ist aber schon klar, daß foreach eine interne Kopie des Arrays anlegt, oder?)
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    Original geschrieben von Trashar
                    foreach($v as $v) ???!
                    na was geht daran nicht?
                    was soll da nicht gehen?
                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      überschreiben die sich nicht?!
                      ich habs nicht ausprobiert nur mal so von der logik her..

                      Kommentar


                      • #12
                        Nein!
                        Das tuts so!

                        Nach Ablauf der Schleife, ist in $v natürlich nur das letzte Arrayelement.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          nur mal so ne frage:

                          wie zum teufel kommt man auf die idee, ein script wie im ersten post zu schreiben?^^

                          Kommentar


                          • #14
                            Langeweile.?.. !

                            Übrigens, es besteht die (zugegebenermaßen geringe) Gefahr, daß das Script aus dem ersten Posting nie endet.

                            Meines Erachtens nach, könnte ein Zufallsgenerator wochenlang nur 3en liefern..
                            was passiert dann in den while Schleifen, da oben...
                            Zuletzt geändert von combie; 28.09.2006, 02:58.
                            Wir werden alle sterben

                            Kommentar

                            Lädt...
                            X