Zufall beeinflussen / Wahrscheinlichkeit (Online-Manager)

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

  • Zufall beeinflussen / Wahrscheinlichkeit (Online-Manager)

    Hallo zusammen,

    vor einiger Zeit habe ich hier mal nach Vorschlägen zur Realisierung eines Online-Fussballmanagers gefragt. Ich habe nun vor einigen Monaten mit der Programmierung begonnen und kam bisher auch sehr gut vorran. Jetzt folgt aber das Schwerste, die Ergebnislogik über Zufallsgeneratoren / vermischt mit den Eigenschaften der Spieler. Um zu vermeiden, dass zu viele Tore fallen, muss ich aber den Zufall irgendwie selbst beeinflussen können (programmierter Zufall). Das heisst anhand der Stärken will ich quasi auswürfeln, wie wahrscheinlich ein Tor ist...die Szenen sind gekapselt in 1 = keine Szene, 2 = Torszene, 3 = Foul und 4 = Sonstiges, wobei bei der Torszene dann noch einmal die Stärke Abwehr (Gegner) mit derer der Stürmer vergleichen werden soll...Ich lasse eine While-Schleife 90 + x Mal durchlaufen, welche die 90 Minuten des Spieles darstellt (soll eine Live-Berechnung werden, Art Textmodus). Quasi über sleep und flush(); generiert. Funzt ja auch alles prima, lediglich habe ich aber nun das Problem, wie verhindere ich, dass einfach unrealistische Ergebnisse entstehen? Ich kann den Zufall zwar beeinflussen, indem ich zum Beispiel schreibe:

    $szene = rand(1,100);

    Und dann halt auswürfle, wenn Zufallszahl kleiner als x usw., aber tendenziell betrachtet bringt mir das gar nix, da die Zufallszahlen ja weiterhin dem Zufall entsprechen und ich ja nicht bestimmen kann, welche Zahl eher kommen soll, sondern lediglich bestimmen kann, bei welcher was ausgeführt werden soll. Und wenn dann eine Zahl dennoch zu oft kommt, dann bringt mir das gar nix.

    Es muss doch irgendwie möglich sein, die Zufälle zu programmieren, selbst zu bestimmen, wie viel Mal eine Zahl kommen darf bzw. wie häufig? Ich habe hier schon mal versucht und habe dabei nix wirklich hilfreiches gefunden, ausser ein index und die Gewichtung über ein Array, aber das Ganze klappte nicht wirklich....! Ich müsste irgendwie auf % verteilen können, wie gross die Wahrscheinlichkeit ist, dass eine bestimmte Zahl x erscheint...

    1 = 60%, 2=20%, 3=10%, 4=5%, 5=5%.... usw.

    Kann mir da vielleicht jemand einen Tipp geben, oder hat jemand einen passenden Codeschnipsel parat? Es bringt mir nix, wenn dann Ergebnisse von xx:xx Zustande kommen, zumal das nicht glaubwürdig ist, denn ich ziehe ja die Stärken mit ein und je höher die Differenz umso "grösser" der "Zufall" für eine Torchance und dann eventuell das Tor...


    Liebe Grüsse und schon einmal vielen Dank!
    Etienne
    Zuletzt geändert von Etienne; 06.02.2004, 21:42.

  • #2
    N´Abend,

    das könntest du so machen:
    PHP-Code:
    $zahl rand(0,100);

    echo 
    $zahl '<br>';

    if(
    $zahl <= 5) {
        
    $szene 5;
    }  elseif(
    $zahl && $zahl <= 10) {
        
    $szene 4;
    }  elseif(
    $zahl && $zahl <= 20) {
        
    $szene 3;
    }  elseif(
    $zahl 19 && $zahl <= 40) {
        
    $szene 2;
    }  elseif(
    $zahl 39 && $zahl <= 100) {
        
    $szene 1;
    }

    echo 
    $szene
    Grüsse,
    Sebastian


    Profil Flex Freelancer
    Twitter twitter.com/flashhilfe
    Web Flash und Flex Community

    Kommentar


    • #3
      Hallo Sebastian,

      erst einmal vielen Dank für Deine Antwort und die Idee! Aber genau so hatte ich es versucht, nur hatte ich dann das Problem, dass mir rand(); zu oft eine Zahl "x" erzeugte und somit immer das Ereignis ausgeführt wurde, obwohl andere eine deutlich grössere Zahlendifferenz belegten.

      Daher, es bringt mir nix, wenn rand zu oft eine Zahl (z.B. 5x) erzeugt, weil es dann im Grunde egal ist, wie ich das in den if-Abfragen aufteile, da zu oft diese Zahl erscheint...deshalb bräuchte ich eine Methode, dies irgendwie bestimmen zu können. Hoffe, man versteht, was ich meine.

      LG,
      Etienne
      Zuletzt geändert von Etienne; 06.02.2004, 21:59.

      Kommentar


      • #4
        Ach so.

        Versuchs mal hier mit:

        PHP-Code:
        srand((double)microtime()*1000000); 
        Note: As of PHP 4.2.0, there is no need to seed the random number generator with srand() or mt_srand() as this is now done automatically.
        Grüsse,
        Sebastian


        Profil Flex Freelancer
        Twitter twitter.com/flashhilfe
        Web Flash und Flex Community

        Kommentar


        • #5
          Stand bereits da...das Problem bestand leider dennoch . Trotzdem vielen Dank! Am liebsten wäre mir die Methode über eine Gewichtung, leider hatte der hier im Forum angegebene Tipp nicht zu einem befriedigenden Ergebnis geführt . Vielleicht hat ja noch jemand eine Idee?!

          LG;
          Etienne

          Kommentar


          • #6
            Ich glaub so langsam versteh ich das Problem nicht mehr. Wenn du eine Zufallszahl generierst, ist diese zufällig. D.h. sie liegt nicht in einem bestimmten Bereich, (bei 0>100) näher 100 oder näher 0, sondern eben zufällig irgend wo. Und genau das macht rand(). - zumindest konnt ich da bisher noch kein bestimmtes Muster feststellen. - oder ist dein Problem genau das?

            Wenn du das Ergebniss von rand() mit den if´s prüfst, legst du eine bestimmte Wahrscheinlichkeit fest. Den bei z.B. 60%, also ($zahl > 39 && $zahl <= 100) ist es doch wahrscheinlicher das die rand-Zahl in dem Bereich liegt, als Beispielsweise bei: ($zahl <= 5) = also 5%.
            Grüsse,
            Sebastian


            Profil Flex Freelancer
            Twitter twitter.com/flashhilfe
            Web Flash und Flex Community

            Kommentar


            • #7
              Richtig, eine Wahrscheinlichkeit, ja, aber ich lege ja nicht die Wahrscheinlichkeit fest, welche Zahl random mir bestimmt (es heisst ja auch nicht umsonst random...), sondern ich lege lediglich fest, wie gross die Wahrscheinlichkeit ist, eine Zahl zu erwischen, die Random generiert, aber genau da liegt das Problem! rand() generiert mir Zahlen, die ich nicht beeinflussen kann, ich kann nicht mal eben bestimmen, wie oft rand() z.B. die 5 ausgeben soll...und manchmal sind Zahlen einfach zu oft da...deshalb ist die Lösung über if Abfragen auch nur bedingt zu gebrauchen, ich hatte es in dem Falle damit versucht (ein Tipp hier im Forum):

              srand ((double) microtime() * 1000000);

              //Array anlegen: die Werte als Indizes, Gewichte als Werte.
              $a = array (1=>4,2=>3,3=>3,4=>2,5=>2,6=>3);
              //Dann holst du die Summe aller Gewichte mit
              $x = array_sum ($a);
              //Zufallszahl ermitteln:
              $r = floor(rand (0,$x));
              // und raussuchen, welcher Wert damit gemeint ist:
              $s = 0;
              for (reset($a); list($z, $w) = each($a); )
              {
              $s+=$w; // bisherige Summe ums aktuelle Gewicht erhoehen
              if ($s>$r) break; // Abbruch wenn Gewichtsumme>Zufallszahl
              }
              // und ausgeben
              echo $z;

              Das ist eigentlich genau das, was ich möchte, nur ist die Gewichtung nur bedingt zu gebrauchen, da ich nicht weiss, wie ich richtig gewichten soll. Ich habe zum Beispiel das Gefühl, als würde er immer die mit Gewicht 2 bevorzugen, obwohl andere z.B. eine höhere Gewichtung haben, und das ist mir nicht so Recht begreiflich. Erhöhe ich dann das Gewicht, erscheint nur noch diese Zahl, keine andere. Ich finde das Gleichgewicht der Funktion oben nicht...Deshalb habe ich nach Alternativen gesucht...

              LG,
              Etienne
              Zuletzt geändert von Etienne; 06.02.2004, 22:23.

              Kommentar


              • #8
                Also noch mal:
                rand(0,100) = irgend eine Zahl zwischen 0 und 100. - es liegt also keine Gewichtung vor

                Wir möchten gerne eine Gewichtung festlegen. Und zwar in Prozent. D.h. wenn wir eine Zahl zwischen 40 und 100 haben, dann ist die Wahrscheinlichkeit bei 60% das wir sie durch rand(0,100) zurück gegeben bekommen, da es 60 Zahlen gibt die darauf zu treffen.

                Bei: 20-40 sind es nur 20 Zahlen die passen würden, deswegen 20%

                10-20 = 10%
                5-10 = 5%
                0-5 = 5%

                Also in PHP umgesetzt:
                PHP-Code:
                $zahl rand(0,100);

                echo 
                $zahl '<br>';

                if(
                $zahl <= 5) {
                    
                $szene 5;
                }  elseif(
                $zahl && $zahl <= 10) {
                    
                $szene 4;
                }  elseif(
                $zahl && $zahl <= 20) {
                    
                $szene 3;
                }  elseif(
                $zahl 19 && $zahl <= 40) {
                    
                $szene 2;
                }  elseif(
                $zahl 39 && $zahl <= 100) {
                    
                $szene 1;
                }

                echo 
                $szene
                <- es ist also wahrscheinlich das es $szene = 1 ist - Chance bei 60%
                Zuletzt geändert von Sebastian W; 06.02.2004, 22:38.
                Grüsse,
                Sebastian


                Profil Flex Freelancer
                Twitter twitter.com/flashhilfe
                Web Flash und Flex Community

                Kommentar


                • #9
                  entweder hab ichs nicht verstanden oder ein lösungsansatz ist banal:
                  PHP-Code:
                  $a = array (1,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6);
                  echo 
                  $a[array_rand($a)]; 
                  Kissolino.com

                  Kommentar


                  • #10
                    Ja so gehts auch.

                    array_rand... ich muß unbedingt die Funktions Referenz mal komplett durchstöbern.

                    Aber auf das hätte ich auch kommen können...
                    PHP-Code:
                    $a = array (1,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6);
                    echo 
                    $a[rand(0,count($a)-1)]; 
                    Grüsse,
                    Sebastian


                    Profil Flex Freelancer
                    Twitter twitter.com/flashhilfe
                    Web Flash und Flex Community

                    Kommentar


                    • #11
                      Original geschrieben von Sebastian W
                      Also noch mal:
                      rand(0,100) = irgend eine Zahl zwischen 0 und 100. - es liegt also keine Gewichtung vor

                      Wir möchten gerne eine Gewichtung festlegen. Und zwar in Prozent. D.h. wenn wir eine Zahl zwischen 40 und 100 haben, dann ist die Wahrscheinlichkeit bei 60% das wir sie durch rand(0,100) zurück gegeben kriegen da es 60 Zahlen gibt die darauf zu treffen.

                      Bei: 20-40 sind es nur 20 Zahlen die passen würden, deswegen 20%

                      10-20 = 10%
                      5-10 = 5%
                      0-5 = 5%

                      Also in PHP umgesetzt:
                      PHP-Code:
                      $zahl rand(0,100);

                      echo 
                      $zahl '<br>';

                      if(
                      $zahl <= 5) {
                          
                      $szene 5;
                      }  elseif(
                      $zahl && $zahl <= 10) {
                          
                      $szene 4;
                      }  elseif(
                      $zahl && $zahl <= 20) {
                          
                      $szene 3;
                      }  elseif(
                      $zahl 19 && $zahl <= 40) {
                          
                      $szene 2;
                      }  elseif(
                      $zahl 39 && $zahl <= 100) {
                          
                      $szene 1;
                      }

                      echo 
                      $szene
                      <- es ist also wahrscheinlich das $szene = 1 ist, da die Chance 60% Beträgt.
                      Ja, aber was ist, wenn rand() mir dann, wie leider mehrfach geschehen, zu oft eine Zahl zwischen 50 und 70 wählt? Trotz srand etc.? Dann kommen die anderen gar nicht zum Zug, auch wenn die Gewichtung viel grösser ist, eigentlich.... Mir ist es ja auch ein Rätsel...

                      @ Wurzel

                      Doch, Du hast mich richtig verstanden und die Alternative sieht wirklich brauchbar und sehr logisch aus, vielen Dank dafür! Ich bin mir fast schon sicher, dass es genau DAS ist, wonach ich suche . Mir fehlt da leider auch noch die Vertrautheit mit der Befehlsreferenz . Dankeschön!
                      Zuletzt geändert von Etienne; 06.02.2004, 22:39.

                      Kommentar


                      • #12
                        Original geschrieben von Wurzel
                        entweder hab ichs nicht verstanden oder ein lösungsansatz ist banal:
                        PHP-Code:
                        $a = array (1,1,1,1,2,2,2,3,3,3,4,4,5,5,6,6);
                        echo 
                        $a[array_rand($a)]; 
                        so hab ichs auch verstanden ...

                        OffTopic:

                        Wurzel
                        Moderator

                        Registriert seit: Jul 2002
                        Wohnort: double-u-upper-valley
                        Beiträge: 3333

                        prost!

                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Original geschrieben von derHund
                          Beiträge: 3333
                          jetzt wo du's sagst/schreibst *lall*
                          Kissolino.com

                          Kommentar

                          Lädt...
                          X