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