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

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

11

11.04.2009, 13:32

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


Ja dann mach doch einfach ne while-Schleife und sobald ein Event eintritt machste ein break;

n0_0ne

1x Contest-Sieger

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

12

11.04.2009, 13:48

hmmm, das wäre eine möglichkeit, allerdings gibts da zwei haken, oder?
1. Wenn ich pech habe, läuft die schleife erstmal 10000 (ok, sehr viel pech xD) durch, bevor ein ereignis eintritt....
2. Spielt dann auch die Reihenfolge der ereignisse, auf die hin ich prüfe eine Rolle... denn Ereignis 3 (50%) kann nur eintreffen, wenn ereignis 1 (25%) und ereignis 2 (25%) nicht eingetreten sind... also 0,75*0,75*0,5 != 0,5 :D

ich denke ich werde es doch weiterhin mit switch case versuchen, wenn es mir zu kompliziert wird mit if/else (1x rand()) (bisschen weniger performance, dafür einfacher zu handhaben) und wenn es mir wirklich zu viel wird, bei neuen ereignissen immer die alten wahrscheinlichkeiten anzupassen, lass ich das die liste für mich machen ^^

Phili

unregistriert

13

11.04.2009, 14:00

Ich versteh ehrlichgesagt nicht ganz die Schwierigkeit.
Wenn du z.B. hast das Ereignis 1 zu 24%, Ereignis 2 zu 13%, Ereignis 3 zu 20% auftritt, dann generierst du halt ne Zufallszahl zwischen 0 und 1 und machst:

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

Chef-Koch

Treue Seele

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

14

11.04.2009, 14:51

Zitat von »"K-Bal"«


Ihh, deutsche Namen ;)

Ich steh auf deutsche Namen xD

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:

die +1 ist ja nur da, damit man bei 1% auch wirklich nur ne 1%ige chance hat, ansonten könnte ja 0 und 1 rauskommen, was aber ne 2% chance wär^^.
Und für Krumme kann man ja die Prozent in Promille umwandeln also würds dann von 1 - 9999 gehen. 1 wäre dann halt 0,01%^^.


@n0_0ne:Wie viele Wahrscheinlichkeiten hast du denn?
falls es nur wenige sind, kannst du es ja so wie Phili gezeigt hat machen, falls es aber unüberschuabr viele sind, musst du dir Gedanken über ne autonome Möglichkeit machen.

also du könntest bei wenigen auch meine Lösung nehmen:

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

jetzt checkt er halt, ob das erste Auftritt, danach obs 2. etc. und sobald eins auftritt überspringt er ja den Rest, also hast du nur 1 Ereignis.
Oder hab ich wieder was übersehen? :lol:
Bei mir überprüft der halt jedes mal aufs neue die Wahrscheinlichkeit, also hast du keine Garantie, dass etwas auftritt!
wenn du das willst, nimmste am besten die Lösung von Phili.

15

11.04.2009, 16:00

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?
mal kurz was ich meine:

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

Du speicherst das Event im Zusammenhang mit der Wahrscheinlichkeit aufzutreten und schaust nach welches von denen eintritt. Hat den Vorteil, dass dynamisch neue Events gespeichert/gelöscht werden können und die Anpassung der Wahrscheinlichkeiten nicht viel Arbeit benötigt.

Jetzt warte ich auf irgendwen der meinen Vorschlag in der Luft zerreißt :)

n0_0ne

1x Contest-Sieger

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

16

11.04.2009, 16:08

Es wird bei mir wohl auf etwa ~15 verschiedene rauslaufen, möglicherweise ein paar mehr, aber es wird sich in Grenzen halten (denke ich)...
Ich werde es dann wohl erstmal so machen wie Phili schreibt. Ist ja wirklich wohl die einfachste/übersichtlichste Variante und wenn der Compiler die Additionen noch rausoptimiert wohl auch recht effizient.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

17

12.04.2009, 03:47

Zitat von »"n0_0ne"«

und wenn der Compiler die Additionen noch rausoptimiert wohl auch recht effizient.


Solange du auf diesem Level unterwegs bist kannste deinen Computer einfach mal als unbegrenzt schnell ansehen und solltest dir darüber keine Gedanken machen.

n0_0ne

1x Contest-Sieger

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

18

12.04.2009, 11:00

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... :D

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

19

12.04.2009, 13:10

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... :D


Wow, 120 mal eine der schnellsten Operationen, die ne CPU kann ;)

Du solltest es nur nicht mit Divisionen übertreiben.

Werbeanzeige