Yadgar: Zahl explizit in String konvertieren?

High!

Für meine Lotto-Simulation suche ich nach einer Funktion, die eine (maximal zweistellige, da 6 aus 49) Integer-Zahl in einen String umwandelt... der Hintergrund: um in der Ziehungs-Routine die umständliche Doppelschleife zur Prüfung auf doppelt gezogene Zahlen zu vermeiden, schreibe ich die Zahlen in einen String (nach dem Schema Zahl-Leerzeichen-Zahl-Leerzeichen-...), den ich bei jeder neuen Zufallszahl dann mit strstr auf schon vorhandene identische Zahlen teste.

Das hier:

$n = rand(1, 49);
    if strstr($nstr, $n)
    {
      echo "Die Zahl $n wurde bereits gezogen, ich ziehe noch einmal!<br>";
      $i--;
    }

funktioniert leider nicht...
Im PHP-Handbuch fand ich unter "String-Funktionen" nichts Passendes... wo könnte ich sonst noch fündig werden?

Bis bald im Khyberspace!

Yadgar

  1. Tach,

    $n = rand(1, 49);
      if(!strstr($nstr, $n)) {
        $nstr .= strval($n)." ";
      }
      else {
        blablub;
      }

    Oder sowas in der Art sollte es tun :)

    dejot

    --
    "Do what thou wilt shall be the whole of the Law"
    ie:( fl:( br:^ va:| ls:& fo:| rl:( n4:? ss:} de:> js:| ch:? sh:( mo:| zu:|
    1. Hi,

      Oder sowas in der Art sollte es tun :)

      Das Problem ist wohl eher, daß strstr() Strings als Parameter erwartet. Was das Zusammensetzen von $nstr angeht: PHP beherrscht, ähnlich wie JS, die automatische Typkonvertierung.

      Und, ach ja: was passiert eigentlich wenn 4 gezogen wird und es wurde bereits 40 gezogen?

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      1. Tach,

        Das Problem ist wohl eher, daß strstr() Strings als Parameter erwartet. Was das Zusammensetzen von $nstr angeht: PHP beherrscht, ähnlich wie JS, die automatische Typkonvertierung.

        strval() ... oder was möchtest du damit sagen?

        Und, ach ja: was passiert eigentlich wenn 4 gezogen wird und es wurde bereits 40 gezogen?

        Da haben wir schon das Problem mit den Strings.
        Ich selber würds auch eher mit Arrays machen.
        z.B.:
        $ns = array(); $i = 1;
        while($i<=6) {
          $n = rand(1, 49);
          if(!isset($ns[$n])) {
            $ns[$n] = $n;
            $i++;
          }
        }
        foreach($ns as $bla) {
          echo $bla." "; // Zeigt die Zahlen an.
        }

        dejot

        --
        "Do what thou wilt shall be the whole of the Law"
        ie:( fl:( br:^ va:| ls:& fo:| rl:( n4:? ss:} de:> js:| ch:? sh:( mo:| zu:|
        1. echo $begrüßung;

          Ich selber würds auch eher mit Arrays machen.
          z.B.:
          $ns = array(); $i = 1;
          while($i<=6) {
            $n = rand(1, 49);
            if(!isset($ns[$n])) {
              $ns[$n] = $n;
              $i++;
            }
          }

          Theoretisch kann dies eine Endlosschleife sein. Denn wenn jedesmal die gleiche Zufallszahl erzeugt würde, bekäme $i nicht in die Gelegenheit, größer als 6 zu werden. Wann hast du zuletzt eine Lotto-Ziehung angesehen? Kannst du dich erinnern, wie sie ablief? Laut meiner Erinnerung liegen zuerst alle Kandidaten in einem Pool und Gewinnzahlen gibt es noch keine.

          $pool = range(1, 49);
            $gewinnzahlen = array();

          Dann wird der Pool gemischt.

          schuffle($pool);

          Die Kugel, die nun als erstes zu liegen kommt ist die Gewinnzahl

          $gewinnzahlen[] = $pool[0];

          und wird aus dem Pool entfernt.

          unset($pool[0]);

          Solange keine 6 Zahlen gezogen wurden geht es beim Mischen weiter.

          echo "$verabschiedung $name";

          1. $pool = range(1, 49);
              $gewinnzahlen = array();

            Dann wird der Pool gemischt.

            schuffle($pool);

            shuffle() wäre hier sicherlich erfolgreicher... :)

            Die Kugel, die nun als erstes zu liegen kommt ist die Gewinnzahl

            $gewinnzahlen[] = $pool[0];

            und wird aus dem Pool entfernt.

            unset($pool[0]);

            Solange keine 6 Zahlen gezogen wurden geht es beim Mischen weiter.

            Man kann es sich auch einfacher machen. Da shuffle() ja das gesamte Array mischt, und die gemischten Zahlen in einer Reihenfolge hinterläßt (im Gegensatz zur Lottomaschine), kann man auch einfach die ersten sechs Zahlen aus dem $pool nehmen, um sechs Lottozahlen zu finden.

            for($i=0; $i<6; $i++)
            { echo "Zahl $i: {$pool[$i]}<br>"; }

            Und fertig.

            Ständiges Neumischen erhöht vielleicht den Rechenaufwand, aber nicht den Zufall.

            1. echo $begrüßung;

              Man kann es sich auch einfacher machen. Da shuffle() ja das gesamte Array mischt, und die gemischten Zahlen in einer Reihenfolge hinterläßt (im Gegensatz zur Lottomaschine), kann man auch einfach die ersten sechs Zahlen aus dem $pool nehmen, um sechs Lottozahlen zu finden.

              Bei der Lotto-Maschine ist es doch genauso. Man könnte nach einmal Mischen 6 Kugeln rausholen. Trotzdem wird jedesmal neu gemischt.

              Ständiges Neumischen erhöht vielleicht den Rechenaufwand, aber nicht den Zufall.

              Das dies in der Sendung so gemacht wird ist vermutlich eine Frage der Psychologie (mehr Mischen = bessere Chancenverteilung) oder der Sendezeitverlängerung. :-)

              echo "$verabschiedung $name";

        2. Hi,

          PHP beherrscht, ähnlich wie JS, die automatische Typkonvertierung.
          strval() ... oder was möchtest du damit sagen?

          strval() ist ja nicht automatische Typkonvertierung.

          Es ist genau umgekehrt, wie Du schriebst:

          if(!strstr($nstr, $n)) {
             $nstr .= strval($n)." ";

          strstr() erwartet Strings (die Ausnahme ist in diesem Fall irrelevant), hier ist eine manuelle Typkonvertierung notwendig -> if(!strstr($nstr,strval($n))) {

          Aber an einen String, wird auch ein String angefügt - selbst wenn das angefügte Element ein Integer-Wert ist -> $nstr.=$n." ";

          (Trotzdem ist hier Vorsicht geboten.)

          Gruß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. hi,

    um in der Ziehungs-Routine die umständliche Doppelschleife zur Prüfung auf doppelt gezogene Zahlen zu vermeiden, schreibe ich die Zahlen in einen String (nach dem Schema Zahl-Leerzeichen-Zahl-Leerzeichen-...),

    Diese Aktion sehen wir wo?

    den ich bei jeder neuen Zufallszahl dann mit strstr auf schon vorhandene identische Zahlen teste.

    Warum willst du das überhaupt über einen String machen, wieso nutzt du kein Array?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Tach,

      Warum willst du das überhaupt über einen String machen, wieso nutzt du kein Array?

      Wäre natürlich sinniger, aber anscheinend möchte er nich ...

      dejot

      --
      "Do what thou wilt shall be the whole of the Law"
      ie:( fl:( br:^ va:| ls:& fo:| rl:( n4:? ss:} de:> js:| ch:? sh:( mo:| zu:|
      1. Hello,

        Wäre natürlich sinniger, aber anscheinend möchte er nich ...

        ...vor allem mag ich gar nicht darüber nachdenken, was er denn macht, wenn er erst die 26 zieht, und anschließend 2 oder 6...

        MfG
        Rouven

        --
        -------------------
        Unser Problem ist, dass wir eine Demokratie entwickelt haben, was nicht immer der richtige Weg ist  --  Bernie Ecclestone zu den lästigen Diskussionen um Regeländerungen in der Formel 1
  3. Ich würde es so machen mit einem assoziativen Array.
    $i=0
    while($i <= 6)
    {
    $n = rand(1, 49);
    if exists($gezogen[$n])
      {
           echo "Die Zahl $n wurde bereits gezogen, ich ziehe noch einmal!<br>";
        }
    else
    {

    $gezogen[$n]=1;
        $i++;

    }

    }