Simulieren eines Münzwurfs (nicht unbedingt eine faire Münze)
-
Für einen zufallsbasierten Algorithmus möchte ich intern eine Münze werfen, also Kopf oder Zahl. Ich kenne die Wahrscheinlichkeit p für Kopf und somit auch für Zahl.
Aber wie würde ich anhand dieser Wahrscheinlichkeit einen Münzwurf mit einer solchen Münze realisieren?
-
if (rand() % 100 < p) kopf(); else zahl();
-
Das rand()%100 ist nicht ganz sauber, wenn es Dir auf absolute Exaktheit ankommt, siehe hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-47483-and-highlight-is-w�rfel.html
-
oder (für windosen): http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx
-
eine münze werfen:
bool kopf = (rand() % 2) == 0; // true, wenn die zufallszahl eine gerade zahl ist; sonst false
eine "schiefe" münze werfen:
const float p = 0.5f; // wahrscheinlichkeit für kopf, 0.0 bis 1.0 bool kopf = float(rand()) / RAND_MAX <= p; // liefert true mit wahrscheinlichkeit p
ungetestet.
-
eine exact gleich geworfene muenze wuerde immer gleich fliegen, der zufall kommt einzig und allein durchs werfen, entsprechend, wenn du es simulieren willst, musst du eine zufallseingabe haben, der algorithmuss dahinter ist dann relativ egal.
eine einfache methode waere eine schleife mit muenze^=rand()&1; und wenn jemand dann auf 'werfen' klickt, gibst du aus was gerade in muenze ist.my2cent
-
rapso schrieb:
eine exact gleich geworfene muenze wuerde immer gleich fliegen, der zufall kommt einzig und allein durchs werfen [...]
Und wenn der Wind deine Münze umbläst zählt das nicht als zufall?
-
Also mein Zufallsgenerator liefert Zahlen im Intervall [0,1), kann ich das dann einfach so machen:
float p = 0.5f; bool kopf = random() <= p;
?
so perfekt braucht es nicht zu sein