Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Wahrscheinlichkeit programmieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.07.2008, 21:14 Uhr
Lensflare



Hallo.

Ich möchte, dass in meinem Programm etwas mit einer bestimmten Wahrscheinlichkeit gemacht wird.

Dazu wäre vielleicht dieses Interface sinnvoll:

C++:
//gibt true zurück, wenn Ereignis mit Wahrscheinlichkeit p eintritt
bool f(float p);



Ich habe es nun mit Hilfe der rand() funktion hinbekommen, dass es mit Wahrscheinlichkeiten, die kleiner oder gleich 0.5 sind, einigermaßen funktioniert.


C++:
#include <iostream>
#include <sstream>

using namespace std;

//gibt true zurück, wenn Ereignis mit Wahrscheinlichkeit p eintritt
bool f(float p)
{
     float w = 1.0/p; //w wird größer, wenn p kleiner wird.
     return (rand()%(int)w) == 0; //je größer das w, desto geringer die Wahrscheinlichkeit, dass 0 gewürfelt wird.
}

int main()
{
    srand(time(NULL));
    
    while(true)
    {
        int a = 0; //Zähler für eingetretene Ereignisse
        for(int i=0; i<1000; i++) //1000 Versuche
        {
            if(f(0.2)) //true mit Wahrscheinlichkeit von 0.2 zurückgeben
            {
                a++;
            }
        }
        
        //Ausgabe: Wie oft ist das Ereignis eingetreten
        stringstream s;
        s << a;
        cout << s.str();
        
        cin.ignore();
    }
    
    return 0;
}



Mit Wahrscheinlichkeiten über 0.5 geht das jedoch nicht.
Das liegt daran, dass ab 0.5 das Ergebnis für
rand()%(int)w immer 0 ist.

Ich würd mich freuen wenn mir jemand einen Tipp geben könnte.
Muss nicht unbedingt C/C++ sein.
Ich will nur wissen, wie man sowas realisieren kann.
Die Programmierspache wähle ich später

Danke im Voraus.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.07.2008, 21:53 Uhr
ao

(Operator)


Die Implementierung von f() ist unbrauchbar, weil beim Zurückfallen von float auf int die Nachkommastellen verlorengehen. Besser wär sowas hier:


C++:
//gibt true zurück, wenn Ereignis mit Wahrscheinlichkeit p eintritt
bool f(float p)
{
    int r = rand ();   // eine zufällige Zahl zwischen 0 und RAND_MAX ziehen.
    bool b = (r < (RAND_MAX * p));  // true, wenn r kleiner ist als MAX * p

    // angenommen RAND_MAX wäre 100, und p wäre 0.7, dann würde b true,
    // wenn r zwischen 0 und 69 liegt - das willst du doch, oder?

    // wie groß RAND_MAX wirklich ist, spielt keine Rolle, Hauptsache, es ist
    // groß genug, dass es beim Runden nicht zu ungenau wird. Nach C-Standard
    // ist RAND_MAX mindestens 32767, glaub ich.

    return b;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.07.2008, 01:25 Uhr
Lensflare



Perfekt!

Danke.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: