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 < 1

    nu hab ich mir das nach einem aufruf von srand so vorgestellt das
    ich die funktion aufrufe

    int 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;
    

    ?


Anmelden zum Antworten