Maus: Einzigartige Random-Zahl in einer for Schleife

Hallo,

bezüglich des folgenden Problems würde ich mich sehr über eure Unterstützung freuen! :)

Innerhalb einer FOR-Schleife wird für jeden Durchgang eine Zufallszahl generiert, was ich bisher mit rand(1,x); gelöst hatte, also quasi recht simpel mit


for ($i=1;$i<=Zahl_x;$i=$i+1) {
	$zufallswert = rand(1,10);
	...
	}

($i fängt hier ganz bewusst nicht bei 0 an)

Nun will ich aber keine repetitiven Muster, jede zufällig generierte Zahl sollte nur ein einziges Mal aufscheinen.

Bastle gerade an einer Array-Lösung und laufe damit phänomenal gegen die Wand, da jeder neue Aufruf der FOR-Schleife vorherige Aufrufe ja "vergisst"... ;(

Bitte bitte bitte um Unterstützung! :)

LG, Maus.

  1. Tach!

    Nun will ich aber keine repetitiven Muster, jede zufällig generierte Zahl sollte nur ein einziges Mal aufscheinen. Bastle gerade an einer Array-Lösung und laufe damit phänomenal gegen die Wand, da jeder neue Aufruf der FOR-Schleife vorherige Aufrufe ja "vergisst"... ;(

    Ich werf mal kommentarlos drei Funktionsnamen in die Runde: array_fill(), array_shuffle(), array_shift().

    dedlfix.

    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      Ich werf mal kommentarlos drei Funktionsnamen in die Runde: array_fill(), array_shuffle(), array_shift().

      ... und key() http://php.net/manual/de/function.key.php möchte ich dazu noch empfehlen. Denn array_fill() kann als Values nur gleiche Werte einfügen, als Keys aber ab einem Startindex Num aufsteigende Keys.

      Array_shuffle() und rand() sind aber beide genauso schlecht bei der Mischung. Wenn das Shuffeln also öfter aufgerufen werden soll, dann muss man sich nicht wundern, wenn öfter die gleichen "Zufallsfolgen" herauskommen.

      @Maus:

      Pseudocode

      • $array = array_fill($start, $anzahl, $egal)
      • solange Werte im Array sind: (count($array) > 0) -- $zufall = key(array_pop($array))

      Spirituelle Grüße Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        ja!

        @Maus:

        Pseudocode

        • $array = array_fill($start, $anzahl, $egal)

        - shuffle($array)

        • solange Werte im Array sind: (count($array) > 0) -- $zufall = key(array_pop($array))

        Hab ich doch glatt das Mischen vergessen. Aber das hätte Maus bestimmt sofort gesehen ;-)

        Spirituelle Grüße Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
      2. Hallo,

        Array_shuffle() und rand() sind aber beide genauso schlecht bei der Mischung. Wenn das Shuffeln also öfter aufgerufen werden soll, dann muss man sich nicht wundern, wenn öfter die gleichen "Zufallsfolgen" herauskommen.

        das stimmt, aber ich hatte die Anforderung so verstanden, dass Werte (Zahlen) aus einer vorgegebenen Menge in zufälliger Reihenfolge auftreten sollen, aber innerhalb einer Serie nie zweimal derselbe Wert. Un da leistet array_shuffle() gefolgt von sequentiellem Auslesen, wie es dein Beispiel macht, hervorragende Dienste.

        Schönen Sonntag noch,  Martin

        --
        Verliebt:    Er spricht, sie lauscht. Verlobt:     Sie spricht, er lauscht. Verheiratet: Beide sprechen, und die Nachbarn lauschen. Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. @@Der Martin:

          ich hatte die Anforderung so verstanden, dass Werte (Zahlen) aus einer vorgegebenen Menge in zufälliger Reihenfolge auftreten sollen, aber innerhalb einer Serie nie zweimal derselbe Wert.

          Ich frage mich, warum man das tun wollte. Wenn man verhindert, dass nach der 13 noch mal die 13 kommt, dann sind die Zahlen nicht mir zufällig.

          LLAP

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            ja!

            ich hatte die Anforderung so verstanden, dass Werte (Zahlen) aus einer vorgegebenen Menge in zufälliger Reihenfolge auftreten sollen, aber innerhalb einer Serie nie zweimal derselbe Wert.

            Ich frage mich, warum man das tun wollte. Wenn man verhindert, dass nach der 13 noch mal die 13 kommt, dann sind die Zahlen nicht mir zufällig.

            Das kann man jetzt zu Tode diskutieren ;-)

            Du hast aber bestimmt schon mal was von Lotto (6 aus 49) gehört? Wäre doch ungewöhnlich, wenn da die 13 zweimal käme :-P

            Da wir Maus hier ja nur Hinweise geben und keine fertigen Skripte, darfst Du die vielfältigen weiteren Möglichkeiten gerne noch erörtern.

            Spirituelle Grüße Euer Robert

            --
            Möge der Forumsgeist wiederbelebt werden!
      3. Tach!

        Ich werf mal kommentarlos drei Funktionsnamen in die Runde: array_fill(), array_shuffle(), array_shift().

        ... und key() http://php.net/manual/de/function.key.php möchte ich dazu noch empfehlen. Denn array_fill() kann als Values nur gleiche Werte einfügen, als Keys aber ab einem Startindex Num aufsteigende Keys.

        Ups, ich meinte ja auch range() statt array_fill().

        dedlfix.

        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          Tach!

          Ich werf mal kommentarlos drei Funktionsnamen in die Runde: array_fill(), array_shuffle(), array_shift().

          ... und key() http://php.net/manual/de/function.key.php möchte ich dazu noch empfehlen. Denn array_fill() kann als Values nur gleiche Werte einfügen, als Keys aber ab einem Startindex Num aufsteigende Keys.

          Ups, ich meinte ja auch range() statt array_fill().

          Ja, das passt dann. Das hatte ich dafür aber vollkommen vergessen :-)

          Wenn man nur wenige Werte aus einer großen Menge haben will ist es normalerweise anders herum auch wirtschaftlicher bezüglich des Speicherplatzes. Also z.B. ein Array mittels mt_rand() füllen und für diesen Sonderfall doppelte vermeiden mit in_array():

          Schleife >>>

          $wert = mt_rand($start, $stop);     if (!in_array($wert, $array, TRUE))     {         $array[] = $wert;     }

          <<<

          Und dann wieder auslesen, wie gehabt.

          Das nur noch als zusätzliche Anregung für Maus.

          Spirituelle Grüße Euer Robert

          --
          Möge der Forumsgeist wiederbelebt werden!
  2. Moin!

    Nun will ich aber keine repetitiven Muster, jede zufällig generierte Zahl sollte nur ein einziges Mal aufscheinen.

    Zufall umfasst auch, dass derselbe Wert mehrfach hintereinander kommen kann. Zumindest wenn man Zufallszahlen ohne Berücksichtigung der Vergangenheit erzeugen lässt, so wie es die Funktion rand() ja macht.

    - Sven Rautenberg

    1. Zufall umfasst auch, dass derselbe Wert mehrfach hintereinander kommen kann.

      Nicht, wenn z. B. das Mischen eines Kartenstapels zu simulieren ist.

      Eine Lösungsidee könnte sein, alle in Frage kommenden Werte zunächst sortiert in einem Array abzulegen und dann der Reihe nach den Inhalt eines jeden Elements mit dem Inhalt eines per Zufall zu bestimmenden anderen Elementes auszutauschen.

      Gruß H.

      1. Om nah hoo pez nyeetz, Herrmann!

        Zufall umfasst auch, dass derselbe Wert mehrfach hintereinander kommen kann. Nicht, wenn z. B. das Mischen eines Kartenstapels zu simulieren ist.

        „Zumindest wenn man Zufallszahlen ohne Berücksichtigung der Vergangenheit erzeugen lässt, so wie es die Funktion rand() ja macht.“

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Volt und voltigieren. http://www.billiger-im-urlaub.de/kreis_sw.gif
  3. Hallo,

    Bastle gerade an einer Array-Lösung und laufe damit phänomenal gegen die Wand,

    Welche Farbe hat denn die Wand, ist es immer dieselbe Wand, kannst du die Wand näher beschreiben?

    Gruß Kalk

  4. Alles klar, danke an alle! :)

    Ich mache mich mit den gewonnenen Erkenntnissen gleich an die Arbeit!

    Grüße aus dem Mäuseloch.