wahrscheinlickeit
-
hallo brüder,
ich möchte ein ereignis abhängig von einer wahrscheinlichkeit auslösen.
zu diesem zweck brauche ich eine funktion,int decision_probability_occured ( double p ) { }
welche entscheiden soll, ob eine wahrscheinlichkeit eingetreten ist.
dieser funktion wird die gewünschte wahrscheinlichkeit übergeben,
z.b. 1/6 oder 1/20 ... etc.
(1/RAND_MAX) <= p < 1nu hab ich mir das nach einem aufruf von srand so vorgestellt das
ich die funktion aufrufeint decision_probability_occured ( double p ) { int interval = RAND_MAX * p; // abrunden, ok int value = rand(); return value < interval; }
ich wähle also das erste intervall von RAND_MAX * p möglichen aus
und lasse rand() entscheiden, ob die wahrscheinlichkeit eingetreten ist.
ein rückgabewert von 0 signalisiert, das die wahrscheinlichkeit nicht eingetreten ist, ein rückgabewert von 1 sagt mir, dass die wahrscheinlichkeit
eingetreten ist, das also das ereignis ausgelöst werden kann.oder wie würdet ihr das machen?
-
Das klingt doch eigentlich ganz brauchbar - wo ist jetzt dein Problem?
-
Das muss, denke ich, <= sein (mal mit p = 1.0 durchdacht), aber sonst sehe ich kein Problem damit. Ich hätte es wahrscheinlich genau andersherum angefangen und
return (double) rand() / RAND_MAX <= p;
geschrieben, aber das ist schlussendlich Geschmackssache.
Natürlich wirst du keine absolute Präzision erreichen - je kleiner RAND_MAX ist, desto gröber ist die Näherung. Auf manchen Systemen ist RAND_MAX 32767; ich weiß nicht, ob dich das tangiert und ob das ggf. für deinen Anwendungsfall von Bedeutung ist, aber behalt es im Hinterkopf.
-
seldon schrieb:
return (double) rand() / RAND_MAX <= p;
oder
return (double) rand() / (RAND_MAX+1) <= p;
oder
return (double) rand() / (RAND_MAX+1) < p;
?
Das ist manchmal nicht einfach. Insbesondere kann man nicht testen, welche Version korrekt ist, sondern muß hart überlegen. Hoffentlich war Deine Version korrekt.
-
Hmm...
Also, RAND_MAX + 1 geht so direkt nicht, es könnte überlaufen (glibc hat RAND_MAX == INT_MAX, und RAND_MAX ist da vom Typ int). Aber du hast recht, für rand() == RAND_MAX liege ich daneben, und ich hätte am Ende ein unregelmäßiges Intervall (tschuldigung).
Wie wäre es hiermit:
return rand() < p * RAND_MAX + p;
?