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
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1random.choices samples with replacement using relative weights, so absolute numbers needn't sum to 100.
- 2Removing a chosen item from the pool turns weighted sampling into weighted sampling without replacement.
- 3Weights only become real probabilities once you divide each by their total.
Related explainers
python
from fastapi import FastAPI, WebSocket, WebSocketDisconnect app = FastAPI()
Building a WebSocket chat with FastAPI
websockets
broadcast
connection-management
Intermediate
9 steps
python
import time import uuid from django.utils.deprecation import MiddlewareMixin
Attaching per-request context in Django
middleware
request lifecycle
multi-tenancy
Intermediate
7 steps
python
import random from typing import Iterator, List
How reservoir sampling picks k items
reservoir-sampling
streaming
randomness
Intermediate
5 steps
python
import secrets from django.contrib.auth import authenticate, login from django.core.cache import cache
Two-factor login with OTP in Django
two-factor-auth
one-time-passwords
caching
Intermediate
9 steps
python
import re from functools import total_ordering from typing import Optional
Parsing and comparing semantic versions
regex
operator-overloading
sorting
Intermediate
7 steps
python
from typing import Any, Sequence, Mapping def render_markdown_table(
Rendering an aligned Markdown table in Python
string formatting
data transformation
closures
Intermediate
8 steps
Share this explainer
Here's the card — post it anywhere.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/weighted-loot-drops-in-python-explained-python-da4c/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.