(This is based on my answer for a similar question on Stack Overflowa 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).