c++ vs. stochastik
-
hi,
habe hier zwei programme, die stochastisch gesehen gleich sind.
das glaube ich zumindest.
allerdings geben sie verschiedene ergebnisse aus.
komisch, was?
und, obwohl es mir total zuwieder ist, seitenweise code zu posten, sehe ich keine alternative.also, wenn ihr einen fehler entdeckt, wäre ich euch sehr verbunden.
(möglichst im ersten programm, das zweite passt so schön zu meinem theoretischen wert.)
eine bestätigung, dass es nicht an mir sondern an einer schlechten implementation von rand() oder an schwankungen in der macht liegt, wäre natürlich noch besser.naja, da sind sie:
int main() { srand( time( NULL ) ); int spiele=0, siege=0; for( int i = 1; i < 100000; ++i ) { if( rand()%36 < 5 ) { ++spiele; ++siege; } else { for( int j = 0; j < 10000; ++j ) { if( rand()%6 < 1 ) { ++spiele; break; } if( rand()%6 < 1 ) { ++spiele; break; } if( rand()%36 < 5 ) { ++spiele; ++siege; break; } if( rand()%36 < 5 ) { ++spiele; ++siege; break; } } } cout << "spiele = " << spiele << " siege = " << siege << " siege/spiele = " << static_cast<float>(siege)/static_cast<float>(spiele) << '\n'; } getch(); }
int main() { srand( time( NULL )); int spiele=0, siege=0; for( int i = 1; i < 100000; ++i ) { if( wuerfel()+wuerfel() == 6 ) { ++spiele; ++siege; } else { for( int j = 0; j < 10000; ++j ) { if( wuerfel()+wuerfel() == 7 ) { ++spiele; break; } if( wuerfel()+wuerfel() == 7 ) { ++spiele; break; } if( wuerfel()+wuerfel() == 6 ) { ++spiele; ++siege; break; } if( wuerfel()+wuerfel() == 6 ) { ++spiele; ++siege; break; } } } cout << "spiele = " << spiele << " siege = " << siege << " siege/spiele = " << static_cast<float>(siege)/static_cast<float>(spiele) << '\n'; } getch(); }
-
huups, da fehlt ja noch was:
int wuerfel( void ) { return (rand()%6)+(rand()%6)+2; }
-
verstehe zwar nicht was stochastisch bedeutet doch wenn du erwartest dass beide programme
das selbe ergebnis liefern dann solltest dusrand( time( NULL ) );
weglassen.
kurt
-
Stochastik == Wahrscheinlichkeitsrechnung
was mir genau missfällt:
ein programm pendelt sich irgendwo bei ~0.33 ein (und zwar bei jedem aufruf, es liegt also nicht an srand() ), das andere bei ~0.45.
-
tschuldige meine erste antwort. habe das problem nicht erkannt.
nach etwas nachdenken kann ich schon einen unterschied erkennen.
schon im if zweig ist ein unterschied
1. versionif( rand()%36 < 5 )
die warscheinlichkeit für einen sieg ist 5 von 36
2.versionwuerfel()+wuerfel() == 6
würfel+würfel liefert zahlen zwischen 4 und 24 das sind 21 möglichkeiten
die warscheinlichkeit für einen sieg ist 1 von 21tut mir leid ich kann nicht erkennen warum die beiden programme die gleichen wahrscheinlichkeiten für einen sieg zurückliefern sollten.
kurt
-
die macht ist wahrlich mit dir.
danke!
ich hatte nur vergessen, dass ich diesmal mit zwei 6-seitigen und nicht mit unregelmäßigen, 10-seitigen würfeln arbeite.
und nun hab' ich meinen theoretischen ansatz soweit verbessert (sprich: flüchtigkeitsfehler korigiert), dass auch da dasselbe rauskommt wie im programm.
( 372780/814716 ,um genau zu sein )