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:
- Add all of the weights together. Call this sum S.
- Generate a random number between 0 and S (excluding S, but including 0). Call this value R.
- Initialize a variable to 0 to keep track of the running total. We'll call this T.
- For each item (I,W) in L:
- T=T+W
- 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