Ankündigung

Einklappen
Keine Ankündigung bisher.

mt_rand soll nie gleiche Nummer aus Array haben - foreach in while Bedingung?

Einklappen

Neue Werbung 2019

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

  • mt_rand soll nie gleiche Nummer aus Array haben - foreach in while Bedingung?

    Hallo,

    ich will eine Zufallsnummer erzeugen die niemals gleich mit Zahlen aus einem Array ist. Den Zufall lasse ich über eine while Schleife laufen wie beispielsweise das hier

    PHP-Code:
    $Startplanet['Startplanet']['X'] = (  mt_rand(  (-$galaxy_width), ($galaxy_width)  )  );
    while(
    $Startplanet['Startplanet']['X'] > $von_X AND $Startplanet['Startplanet']['X'] < $bis_X) {
        
    $Startplanet['Startplanet']['X'] = (  mt_rand(  (-$galaxy_width), ($galaxy_width)  )  );

    Notiz: mt_rand fängt dabei bei minus an. Ich weiß nicht ob das später ein Problem darstellen sollte.

    Das Beispiel oben funktioniert soweit $Startplanet['Startplanet']['X'] 1 Element enthält.

    Was macht der while loop wenn $Startplanet['Startplanet']['X'] mehr als 1 Element enthält?
    Durchläuft es alle Elemente aus dem $Startplanet['Startplanet']['X'] Array und gibt mir zum Schluss eine Zahl aus die trotzdem gleich dem ersten Element aus dem Array sein kann?

    Notiz: $Startplanet['Startplanet']['X'] kann mehrere hundert keys besitzen.


    Theoretisch würde ich die while Schleife so aussehen lassen. D.h. die Bedingung soll alle value aus dem Array haben (die jeweils kleiner Zahl-50 & großer Zahl+50 sind).

    PHP-Code:
    $zufall = (  mt_rand(  (-$galaxy_width), ($galaxy_width)  )  );
    while(
        
    $zufall $X_zahl1-50 AND
        
    $zufall $X_zahl1+50 AND

        
    $zufall $X_zahl2-50 AND
        
    $zufall $X_zahl2+50

        
    //AND

        //...
        
    ) {
        
    $zufall = (  mt_rand(  (-$galaxy_width), ($galaxy_width)  )  );

    Leider habe ich kein Plan wie ich das schreiben soll. Führt php ein foreach in einer while Bedingung aus?

    Ich habe schon überlegt das Array als eine Zeile auszugeben und das denn über die while Bedingung laufen zu lassen aber ich habe das Gefühl, das dies auch nicht funktionieren wird.

    PHP-Code:
    $count_x count($oCoords_S['oCoord']['Startplanet']['x']);
        
    $a1 0;
        
    $X '';
        foreach (
    $oCoords_S['oCoord']['Startplanet']['x'] as $key => $value) {

            if(++
    $a1 === $count_x) {
                
    $X .= $value.'';
            } else {
                
    $X .= $value.', ';
            }

        } 

    Gruß

  • #2
    Wie wäre es damit: Befülle ein Array mit allen Zahlen, mische es (shuffle()), ziehe eine Zahl und entferne sie aus dem array (array_shift())

    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Danke,

      ich werde diese Lösung benutzen

      PHP-Code:
      while( in_array( ($n rand(1,10)), array(2,810) ) );
      echo 
      $n
      d.h. ich kann mir alle Daten aus der DB holen, diese in ein Array auf eine Zeile legen und dies dann über eine while Schleife ausgeben.

      Kommentar


      • #4
        Ja.
        Deine Überschrift sagt aber was anderes
        mt_rand soll nie gleiche Nummer aus Array haben
        diverse Beispeile
        PHP-Code:
        // Nummern nicht im Array
        do {
            
        $n rand(1,10);
        }while ( 
        in_array($n, array(246810))  );
        echo 
        $n;     

        echo 
        "<br>\n";

        // nur gerade Nummern
        $n rand(1,10/2);
        echo 
        $n*2-1;

        echo 
        "<br>\n";

        // nur ungerade Nummern
        $n rand(1,10/2);
        echo 
        $n*2

        Kommentar


        • #5
          Es ist egal ob es gerade Zahlen oder ungerade Zahlen sind weil random von -XXX bis XXX geht wie in meinem ersten Thread beschrieben. Nimm irgendwelche Zahlen die dir gefallen. Es geht darum das eine Zufällig erzeuge Zahl die nicht gleich Zahlen aus einem Array sein soll.

          PHP-Code:
          while( in_array( ($n rand(-a,z)), array(a,b,c,d,e,f,g,h,...) ) );
          echo 
          $n

          Das Beispiel mit 2,4,6,8,10 habe ich zum überprüfen verwendet um zu sehen, ob es wirklich funktioniert.

          Kommentar


          • #6
            Die Lösung #3 birgt theoretisch die Gefahr eine Endlosschleife zu erzeugen. Dagegen solltest du noch Vorkehrungen treffen.

            Kommentar


            • #7
              Dann eben immer mindestens höchster Wert +1 als letzten Wert drin haben, damit wenigstens ein Ergebnis kommt.

              PHP-Code:
              // erzeugt eine Zufallszahl zwischen kleinstem und grössten Wert plus 1 aus einem Array
              $number = array(12345678910);
              $last max$number ) + 1;
              $first min$number );

              // Nummern nicht im Array
              do {
                  
              $n mt_rand($first,$last);    
              }while ( 
              in_array($n$number)  );
              echo 
              $n;     

              echo 
              "<br>\n";   // 11 
              sollte zumindest als Ansatz genügen.

              Kommentar


              • #8
                Zitat von jspit Beitrag anzeigen
                Die Lösung #3 birgt theoretisch die Gefahr eine Endlosschleife zu erzeugen. Dagegen solltest du noch Vorkehrungen treffen.
                Ah Danke für den Hinweis. Das ist in meinem Fall recht einfach nämlich count() Array darf nicht größer gleich $galaxy_width*2 sein. galaxy_width ist in diesem Fall eine definierte Zahl und wenn count Array diese nicht überschreitet sollten immer noch Zahlen frei sein. (oder?)

                Danke vielmals für eure Hilfe.

                Kommentar

                Lädt...
                X