python 37 lines · 7 steps

Weighted loot drops in Python

A small weighted-random system that rolls loot by rarity, supports unique picks, and reports true drop odds.

Explained by highlit
1import random
2from dataclasses import dataclass
3 
4 
5@dataclass(frozen=True)
6class LootDrop:
7 name: str
8 weight: float
9 
10 
11LOOT_TABLE = [
12 LootDrop("common_potion", 60.0),
13 LootDrop("rare_sword", 25.0),
14 LootDrop("epic_shield", 12.0),
15 LootDrop("legendary_ring", 3.0),
16]
17 
18 
19def roll_loot(table=LOOT_TABLE, rolls=1):
20 weights = [drop.weight for drop in table]
21 return random.choices(table, weights=weights, k=rolls)
22 
23 
24def roll_unique_loot(table=LOOT_TABLE, count=2):
25 pool = list(table)
26 picked = []
27 while pool and len(picked) < count:
28 weights = [drop.weight for drop in pool]
29 chosen = random.choices(pool, weights=weights, k=1)[0]
30 picked.append(chosen)
31 pool.remove(chosen)
32 return picked
33 
34 
35def drop_probabilities(table=LOOT_TABLE):
36 total = sum(drop.weight for drop in table)
37 return {drop.name: drop.weight / total for drop in table}
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1random.choices samples with replacement using relative weights, so absolute numbers needn't sum to 100.
  2. 2Removing a chosen item from the pool turns weighted sampling into weighted sampling without replacement.
  3. 3Weights only become real probabilities once you divide each by their total.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Weighted loot drops in Python — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code