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
Alter Hase
Zitat von »"n0_0ne"«
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...
Phili
unregistriert
Quellcode |
|
1 2 3 4 5 6 |
if(Zahl<0.24) Ereignis1(); else if(Zahl<0.24+0.13) Ereignis2(); else if(Zahl<0.24+0.13+0.2) Ereignis3(); |
Zitat von »"K-Bal"«
Ihh, deutsche Namen
Zitat
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 |
if(miniWahrscheinlichkeit(100)) // in Promille, also 1% doThis(); else if(miniWahrscheinlichkeit(30)) // 0,3% doThat(); else if(miniWahrscheinlichkeit(200)) // 2% doSomething(); |
mal kurz was ich meine:Zitat von »"n0_0ne"«
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?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
struct Container { int propability; //Chance in %, %o, whatever... wie genau es sein muss void (*event)(); //Funktionszeiger auf das, was passieren soll } void foo() { //do something } void bar() { //do something } int main() { List<Container> EvtList; //Liste mit den Events die auftreten können Container Event1, Event2; //Langweilige initialisierung... Event1.propability = 5; Event2.propability = 10; Event1.event=foo; Event2.event=bar; EvtList.push_back(Event1); EvtList.push_back(Event2); int rnd = rand(0, 1000); //hier wirds wieder spannend for(List<Container>::iterator i = EvtList.begin(), int sum = 0; tmp != EvtList.end(); i++) { sum += i.propability; if(sum > rnd) { i.event(); break; } } return 0; } |
Alter Hase
Zitat von »"n0_0ne"«
und wenn der Compiler die Additionen noch rausoptimiert wohl auch recht effizient.
Alter Hase
Zitat von »"n0_0ne"«
Naja, aber bei 15 Ereignissen kommt da schon einiges Zusammen... vorausgesetzt das letzte ereignis tritt ein sind das n * (n+1) / 2.... bei 15 also schon 120 Additionen jeden Frame... Aber ich bin mir ziemlich sicher, dass der Compiler das schon vorberechnet...
Habe es bereits umgeschrieben, und funktioniert auch gut, habe jedenfalls keine Einbußungen bemerkt, was die Performance angeht...
Werbeanzeige