Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

10.04.2009, 20:16

Wahrscheinlichkeitsverteilung

Hallo,
ich habe schon seit längerem ein Problem mit Wahrscheinlichkeiten für irgendein bestimmtes Ereignis...
Bis jetzt mache ich es so, dass ich mir eine zufällige Zahl zwischen 1 und 100 generieren lasse, und dann per switch/case die einzelnen Fälle durchgehe...
Durch fehlende breaks kann ich dann mehrere "Prozent" für ein ereignis realisieren. Ich denke weil bei switches, soweit ich weiß, ja eine sprungtabelle vorberechnet wird und direkt zu dem passenden fall gesprungen wird müsste das ja relativ effizient sein...
Nur was ist, wenn ein bestimmtes Ereignis nur eine Wahrscheinlichkeit von 1:5000 haben soll? Ich kann ja schlecht 5000 cases einbauen... und die switches verschachteln ist irgendwie auch nicht grade übersichtlich... also ich meine damit für einen bestimmten case fall, dann das gleiche nochmal zu machen, um ein "prozent" weiter aufzusplitten...
Wie macht man sowas normalerweise? Wäre für ein paar gute Ideen sehr dankbar :D

2

10.04.2009, 20:30

Generier dir einfach ne Zufallszahl zwischen 1 und 5000. Wenn die Zahl 1 ist, ist es eingetreten.

Mit Prozenten mach ich es auch so. Eine Zahl zwischen 1 und 100. Wenn diese <= 10, dann ist eine zehnprozentige Wahrscheinlichkeit eingetreten.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

10.04.2009, 21:45

naja, aber ich habe ja mehr als nur ein einziges ereignis, was eintreten kann, deshalb wäre das nicht so toll, wenn ich 1 bis 5000 generieren lasse, und dann die 1 abfrage für das eine ereignis... dann müsste ich ja die restlichen 4999 cases immer noch machen... oder ich lasse es in einer großen if else if else if ..... orgie ausarten, mit denen ich dann eben auch die werte zwischen (beispielsweise) 400 und 4800 direkt abfangen kann...
gibts da keine tolle möglichkeit, mit der man dann auch schnell und einfach ein neues ereignis einbauen kann, ohne alle anderen ändern zu müssen?

4

10.04.2009, 23:56

nichts was irgendwie über switch/case läuft

du kannst die werte, bei denen was passiert, und das entsprechende ereignis in ein containerobjekt packen, alles in eine liste schieben und diese dann durchlaufen und abfragen was eingetreten ist. nicht ganz so perfomant wie eine switch/case verschachtelung, aber bei bis zu 100 ereignissen wird die auch nicht übersichtlicher ;)

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

5

11.04.2009, 09:59

hmmm, so ganz verstehe ich nicht, wie du das meinst...
ein ereignis, welches dann beispielsweise 3 mal so oft wie ein anderes auftreten soll, muss dann auch 3 mal so oft in der liste eingetragen sein?

Phili

unregistriert

6

11.04.2009, 12:35

ministry hat doch schon gesagt wie man das machen würde.
Alternativ könntest du auch eine Fließkommazahl zwischen 0 und 1 generieren und dann das ein Ereignis ausführen wenn die Zahl kleiner ist als 1/5001, wenns größer ist, führst du das andere Ereignis aus.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

7

11.04.2009, 12:43

Zitat von »"n0_0ne"«

naja, aber ich habe ja mehr als nur ein einziges ereignis, was eintreten kann, deshalb wäre das nicht so toll, wenn ich 1 bis 5000 generieren lasse, und dann die 1 abfrage für das eine ereignis... dann müsste ich ja die restlichen 4999 cases immer noch machen... oder ich lasse es in einer großen if else if else if ..... orgie ausarten, mit denen ich dann eben auch die werte zwischen (beispielsweise) 400 und 4800 direkt abfangen kann...
gibts da keine tolle möglichkeit, mit der man dann auch schnell und einfach ein neues ereignis einbauen kann, ohne alle anderen ändern zu müssen?


Du musst den Zufallsgenerator einfach für jedes Ereignis einmal ausführen!

Also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
srand(time(NULL));
int x = rand();
if(x ..)
{
  Ereignis1;
}
x = rand();
if(x ..)
{
  Ereignis2;
}

Chef-Koch

Treue Seele

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

8

11.04.2009, 13:09

mach halt ne Funktion, die du immer aufruft, wenn du ne Wahrscheinlichkeit haben willst, also z.B:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool Wahrscheinlichkeit(int Prozent){ //Prozent sollte von 1-99 sein

if(Prozent >= 100) //ne 100%ige wahrscheinlichkeit und größer -> automatisch richtig

  return true;
if(Prozent <= 0)
  return false;

int zahl = rand()% 101 +1;

if(zahl <= Prozent)
  return true;

else
  return false;
}


und dann im prog aufrufen:

C-/C++-Quelltext

1
2
3
4
5
if(Wahrscheinlichkeit(25)  //Wahrscheinlichkeit von 25%

do_this();

if(Wahrscheinlichkeit(10) //Wahrscheinlichkeit von 10%

do_that();


oder habe ich was falsch verstanden (bin grad erst aufgestanden...)?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

9

11.04.2009, 13:30

Die letzten beiden geposteten möglichkeiten hätten dann aber zur folge, dass auch mehrere ereignisse auftreten können, das will ich aber nicht :)

Die möglichkeit mit der liste (oder vielleicht etwas performanterem zum suchen) werde ich mal testen, falls die performance aber merklich runtergeht muss ich es wohl doch wieder mit switches, oder if else machen...

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

10

11.04.2009, 13:31

Zitat von »"Chef-Koch"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool Wahrscheinlichkeit(int Prozent){ //Prozent sollte von 1-99 sein

if(Prozent >= 100) //ne 100%ige wahrscheinlichkeit und größer -> automatisch richtig

  return true;
if(Prozent <= 0)
  return false;

int zahl = rand()% 101 +1;

if(zahl <= Prozent)
  return true;

else
  return false;
}



Ihh, deutsche Namen ;)

Ich hab es noch ein bisschen abgewandelt, die "+1" in der einen Zeile sind auch zu viel. Man sollte auch 0 und krumme Werte kriegen können:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool getEventHappened(float propability)
{
if(propability >= 100.f)
  return true;
if(propability <= 0.f)
  return false;

float randValue = (float)(rand()% 10001) / 100.f;

if(randValue <= propability)
  return true;

else
  return false;
}


Not tested, yet ;)

Werbeanzeige