- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 12

Thema: Spielerfehlschluss

Hybrid-Darstellung

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

    Spielerfehlschluss

    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
    8.686
    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.555
    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

Berechtigungen

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

Solar Speicher und Akkus Tests