Tuesday, April 17, 2018

game design - Algorithm for determining random events



I'm struggling with coming up with an elegant solution to generating random events in the game that I'm working on.



Say there are 4 classes of events that can happen, with varying events in those classes that may occur.


So something along the lines of


main_events = {"common event", "not so common event", "somewhat rare event", "rare event"}
sub_events[0] = {"common event 1", "common event 2",..}
...

I have a somewhat kludgey solution in place that first just has a random number generated between 0 and 100, and if the number falls within a given range then a main event will be triggered. Then I'll do another random roll to see which sub event occurs.


Is there a better solution than something along these lines? Like I mention, it doesn't feel very elegant, and I'd like to make it easily expandable for the addition of future events.



Answer



(This is based on my answer for a similar question on Stack Overflow.)



It sounds like you're asking for a more flexible way of specifying the probability of each event. For that, you can use a simple weighing algorithm: simply decide how common each event should be and assign it a weight that is appropriate compared to the other weights. For example, if you have events A, B and C, with probabilities 70%, 25% and 5%, you could give them the weights 70, 25 and 5 (or 14, 5, and 1 - the important thing is the relative difference).


Once you have that, you can use the following algorithm to select an event:


Given a list L of items (I,W), where I is the item and W is the weight:



  1. Add all of the weights together. Call this sum S.

  2. Generate a random number between 0 and S (excluding S, but including 0). Call this value R.

  3. Initialize a variable to 0 to keep track of the running total. We'll call this T.

  4. For each item (I,W) in L:

    1. T=T+W


    2. If T > R, return I.




It's up to you if you want to first select between the different groups of events, or if you want a single table with all of the events (where each "group" has an appropriate sum compared to the others).


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...