Pick Random Item Based on Probability

January 8, 2020 on unity

I was working on my game recently and realized my random item code doesn’t randomly select items the correct way.

For example in my game, when entering a store it randomly fills the store with items. It should mostly pull in common items but if you’re lucky it’ll have some rare items. The best way to handle this is like so:

Create enum

public enum Rarity {
    Hidden = 0,
    Basic = 1,
    Common = 2,
    Uncommon = 3,
    Rare = 4,
    VeryRare = 5
}

Static Array of Probabilities

Create a static array of your items and the probabilities. All the values added up should equal 100.

public static KeyValuePair<Rarity, int>[] ITEM_RARITY_PROBS = {
    new KeyValuePair<Rarity, int>(Rarity.VeryRare, 5), // 5% chance
    new KeyValuePair<Rarity, int>(Rarity.Rare, 15), // 15% chance
    new KeyValuePair<Rarity, int>(Rarity.Uncommon, 20), // 20% chance
    new KeyValuePair<Rarity, int>(Rarity.Common, 30), // 30% chance
    new KeyValuePair<Rarity, int>(Rarity.Basic, 30) // 30% chance
};

Probability Calculation

As the loop is ran the cumulative value increases therefore making the next chance higher. I won’t go into the details but the math works out so the other items have a proper probability of being chosen.

public Rarity GetRandomRarity() {
    int cumulative = 0;

    for (int i = 0; i < ITEM_RARITY_PROBS.Length; i++) {
        cumulative += ITEM_RARITY_PROBS[i].Value;

        if (UnityEngine.Random.Range(0, 100) < cumulative) {
            return ITEM_RARITY_PROBS[i].Key;
        }
    }

    return Rarity.Basic;
}