-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Spielerfehlschluss

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935

    Spielerfehlschluss

    Anzeige

    Der Spielerfehlschluss ist ein logischer Fehlschluss, dem die falsche Vorstellung zugrundeliegt, ein zufälliges Ereignis werde wahrscheinlicher, wenn es längere Zeit nicht eingetreten ist, oder unwahrscheinlicher, wenn es kürzlich/gehäuft eingetreten ist. [Q: Wikipedia / http://de.wikipedia.org/wiki/Spielerfehlschluss]

    Um das zu demonstrieren, habe ich ein kleines C Programm geschrieben. Es wird ein Spiel simuliert, bei dem das eingesetzte Kapital verzehnfacht werden soll, zuerst ohne jede Strategie. Startkapital = 1 Münze, es wird dann weitergespielt (Münzwurf mit r=rand()%2), wobei immer 1 Münze gesetzt wird. Gelingt es im Lauf von beliebig vielen Spielen, 10 Münzen zu erreichen, gilt das Gesamtspiel als gewonnen.
    Code:
    int verloren=0,gewonnen=0,n=10000000;
    
      for(int i=0;i<n;i++)
      {
    
        int kapital=1,spiele=0;
    
        while(1)
        {
          spiele++;
          int r=rand()%2;
          if(r>0)kapital++;
          else kapital--;
          if(kapital==10)
          {
            //printf("Verzehnfacht nach %d Spielen.\n",spiele);
            
            gewonnen++;
            break;
          }
          else if(kapital==0)
          {
            //printf("Verloren nach %d Spielen.\n",spiele);
            verloren++;
            break;
          }
    
        }
      }
    
      printf("%d Spiele gewonnen, %d verloren.\n",gewonnen,verloren);
      printf("Wahrscheinlichkeit zu gewinnen ist %lf\%\n",((float)gewonnen/(float)n)*100);
    Wie man erwartet hätte, nähert sich die Wahrscheinlichkeit den 10%.

    Nun dasselbe Spiel mal "mit Strategie". Und zwar wird eine Serie abgewartet, das heisst es wurde zB 5 Mal dasselbe Ergebnis geworfen, danach wird erst der Einsatz gemacht, und zwar auf das Ergebnis, das nun 5 Mal nicht eingetreten ist. Wenn es nach der Wiki geht, sollte da die Wahrscheinlichkeit ebenfalls 10% sein, denn die Münze hat ja kein Gedächtnis.

    Ich komme mit meinem Programm aber auf eine höhere Gewinnwahrscheinlichkeit, weswegen ich denke, dass ich da irgendwo einen Fehler drin haben muss. Oder ist vielleicht der Zufalls-Algorithmus schlecht?

    Code:
      for(int i=0;i<n;i++)
      {
    
        int kapital=1,spiele=0;
    
        int serie=0, last=-1, setnow=0;
    
        while(1)
        {
          spiele++;
    
          int r=rand()%2;
    
          if(setnow)
          {
            serie=0;
            setnow=0;
            if(r==0)kapital++;
            else kapital--;
          }
    
          if(r>0&&last>0)serie++;
          else serie=0; 
    
          if(serie==4)setnow=1;
    
          if(kapital==10)
          {
            //printf("Verzehnfacht nach %d Spielen.\n",spiele);
            
            gewonnen++;
            break;
          }
          else if(kapital==0)
          {
            //printf("Verloren nach %d Spielen.\n",spiele);
            verloren++;
            break;
          }
          last=r;
        }
      }
      printf("mit system:\n");
      printf("%d Spiele gewonnen, %d verloren.\n",gewonnen,verloren);
      printf("Wahrscheinlichkeit zu gewinnen ist %lf\%\n",((float)gewonnen/(float)n)*100);
    Der Zufallszahlengenerator wird übrigens vorher mit time() initialisiert:
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h> // random
    #include <math.h>
    #include <time.h>
    
    int main()
    {
      time_t t;
      time(&t);
      srand((unsigned int)t); 
      ......
    Vielleicht sieht jemand meinen Fehler.

    Liebe Gruesse von der Katze

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Moin robocat,

    ich habe mal Deine beiden Programme laufen lassen und bekomme bei beiden Werte um die 10% (mit GCC 4.1.2 - ich habe gerade keinen anderen). Einen logischen Fehler kann ich auch nicht entdecken. Das scheint also so OK zu sein. Hast Du mal 'ne Handvoll konkreter Werte? Wie hoch ist denn die höhere Wahrscheinlichkeit?

    BTW: bei Simulationen ist es eher ungünstig den Zufallszahlengenerator mit der Zeit zu initialisieren - ein fester Wert ist da für Fehlersuchen besser geeignet (wegen der Reproduzierbarkeit); evtl als Kommandozeilenparameter. Wenigstens solltest Du den Startwert ausgeben.

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.584
    Ich hatte mal eine Würfelstatistik auf einem Taschenrechner programmiert. Die Zufallszahl war selbst geschrieben [ Nachkommazahl mit wählbarem Erstwert mal Pi - davon Nachkommawert - den mit sechs multipliziert plus eins - davon Integer abgeschnitten ergibt Würfelaugen; Pi ist die Konstante mit den meisten Nachkommastellen im Rechner]. Die Rechnung war double - der verwendete HP 42 rechnet intern, soweit ich weiß, mit etwa 18 Stellen, die auf double gerundet werden.

    Die von mir errechnete Statistik schielte eindeutig. Ich hatte damals vermutet, dass jeder "Zufalls"algorithmus eben doch nur eine konkrete Rechenvorschrift ist, die ausgewählte Maxima und Minima hat. Da finde ich Deine zeitliche Zufallbasis doch gut. Aber den Grund für Deine Suche vermute ich trotzdem in der Zufälligkeit.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    OK - ein bisschen offtopic: Zufallszahlen erzeugen ist nicht einfach: klick und klick.

    viele Grüße und offtopic Ende
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Danke für eure Antworten, vor Allem auch danke an danimath für das Testen mit einem anderen Compiler (und für die lesenswerten Links). Ich benutze den alten Borland BCC32 Compiler, dessen Zufallsfunktion ich bisher für ANSI-C kompatibel hielt und deshalb darauf vertraut habe.

    Bei 10 Millionen Spielen rechnet das Programmchen eine Weile und kommt dann auf völlig unglaubwürdige Ergebnisse (hier wurde "if(serie==3)setnow=1;" benutzt):
    Klicke auf die Grafik für eine größere Ansicht

Name:	rand.jpg
Hits:	13
Größe:	15,7 KB
ID:	20217

    Das ist auch, bis auf sehr wenige Ausnahmen, mit verschiedenen srand() Werten reproduzierbar.

    Da ich auch grade keinen anderen C Compiler habe, werde ich vielleicht den Spass mal in php umsetzen. Vielleicht hat auch jemand von euch ein paar brauchbare Zufalls-Algorithmen.

    Liebe Gruesse von der Katze

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von robocat Beitrag anzeigen
    Vielleicht hat auch jemand von euch ein paar brauchbare Zufalls-Algorithmen.

    Liebe Gruesse von der Katze
    Nicht wirklich, aber so weit mir bekannt sind alle diese Zufalls Generatore nicht SO wirklich brauchbar. So etwas sollte man aus "rosa Rauschen" ableiten.

    Gruß Richard

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Aus dem Link von danimath:
    Knuth suggests various generators, including one that combines the first two table entries above:
    • xn+1 = 48271*xn mod (231 - 1),
      yn+1 = 40692*yn mod (231 - 249),
      zn = (xn - yn) mod (231 - 1),
    Ok, diesen Generator habe ich nun mal verwendet
    Code:
    unsigned long lastrandom1,lastrandom2;
    
    unsigned long random()
    {
      unsigned long z=(lastrandom1-lastrandom2)%2147483647; // 2^31-1
      lastrandom1=(48271*lastrandom1)%2147483647;
      lastrandom2=(40692*lastrandom2)%2147483399; // 2^31-249
      return z;
    }
    
    // Seed:
    
      time_t t;
      time(&t);
      srand((unsigned int)t);
    
      lastrandom1=rand(); 
      lastrandom2=rand();
    Und sieheda, auch wenn der Generator nicht perfekt ist, lässt sich damit kein Vorteil beim Spiel "mit system" mehr feststellen.

  8. #8
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.979
    Hallo!

    So wie der Richard schrieb, fast perfekte Zufallsgeneratore lassen sich (wie in der Natur) nut Analog hardwaremässig realisieren. Besser und einfacher als "rosa" ist "weiss" Rauschen. Als Lekture würde ich das empfehlen: http://www.roboternetz.de/community/...%9Fes-Rauschen
    Geändert von PICture (06.10.2011 um 17:50 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Zitat Zitat von robocat Beitrag anzeigen
    Ok, diesen Generator habe ich nun mal verwendet
    Ich wollt's noch vorschlagen Eigentlich sind bei den aktuellen Pseudo-Zufallszahlengeneratoren nur die in der Art von D. Knuth verbreitet (in Java wird sogar explizit drauf verwiesen). Wer das Geld ausgeben möchte (oder eine gute Bibliothek in der Nähe hat), mag sich gern mal "The Art of Computer Programming" von D. Knuth zulegen (oder mal reinschauen). Neben Pseudozufallszahlen gibt es da auch so spannende Sachen wir Suchen Sortieren, Listen,... Man kann also viel über grundlegende Algorithmen lernen.

    "Echte" Zufallszahlen sind - wie schon PICture und Richard geschrieben haben - nicht mit Algorithmen zu erzeugen. Das beste ist immer noch ein radioaktives Präparat mit einen Zähler; aber das bringt wieder andere Probleme

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  10. #10
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.979
    Wenn jemand Lust auf einfache Experimente hat, dann: http://www.roboternetz.de/community/...rator-(gelöst) .

    Übrigens, ich werde sehr dankbar für Ausprobieren und Berichten. Am einfachsten wäre fehlerhaftes Unterprogramm für internen ADC Wandler., falls in dem µC vorhanden.
    Geändert von PICture (06.10.2011 um 18:38 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •