robocat
05.10.2011, 17:18
Der Spielerfehlschluss ist ein logischer (http://de.wikipedia.org/wiki/Logik) Fehlschluss (http://de.wikipedia.org/wiki/Fehlschluss), dem die falsche Vorstellung zugrundeliegt, ein zufälliges (http://de.wikipedia.org/wiki/Zufall) 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.
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?
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:
#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
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.
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?
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:
#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