Data / Odds
How the simulation works and where every number comes from. No hidden magic.
Rarity model
Valve published the generative rule, not just a table: in a weapon case each rarity tier is 5× rarer than the tier below it, and the Rare Special Item (knife / glove) is 2.5× rarer than Covert. DropLab implements that rule and renormalises over whichever tiers a given container actually holds.
| Tier | Relative weight | Probability | Odds |
|---|---|---|---|
| Mil-Spec Grade | ×1 | 79.92% | 1 in 1.3 |
| Restricted | ×5 rarer | 15.9847% | 1 in 6.3 |
| Classified | ×25 rarer | 3.1969% | 1 in 31.3 |
| Covert | ×125.0 rarer | 0.6394% | 1 in 156 |
| Rare Special Item | ×312.5 rarer | 0.2558% | 1 in 391 |
Within a tier, every skin is treated as equally likely — Valve has never published per-skin weights, and equal weighting is the community standard. The engine is deterministic under a seeded RNG (see the test suite) and uses crypto.getRandomValues for live rolls.
Float & wear
A raw float is drawn uniformly in [0, 1), then mapped into the skin's own range: float = min + raw × (max − min). Wear is derived from the result — never rolled first — so skins whose range excludes a wear simply never produce it.
| Factory New | 0.00 – 0.07 |
| Minimal Wear | 0.07 – 0.15 |
| Field-Tested | 0.15 – 0.38 |
| Well-Worn | 0.38 – 0.45 |
| Battle-Scarred | 0.45 – 1.00 |
Market data shows Factory-New clustering; that is a listing-selection effect, not a generation effect, so it is intentionally not modelled.
StatTrak, pattern & special finishes
- StatTrak: an independent 10% roll on items that can exist in StatTrak form (per the upstream
stattrakflag). Gloves are never StatTrak. StatTrak status feeds the value estimate. - Pattern seed: every applicable item gets an index in [0, 1000], shown in the result and inventory.
- Special finishes: Doppler / Gamma Doppler phases (Ruby, Sapphire, Black Pearl, Emerald), Fade, Marble Fade, Case Hardened, etc. are surfaced only when they can be read from the upstream data — phase-priced valuation is future work.
Data sources & provenance
- Case & skin metadata
- ByMykel/CSGO-API (MIT) — cases, skins, rarities, float ranges, StatTrak eligibility, keys
- Item & case artwork
- Steam CDN URLs referenced from the metadata (community.*.steamstatic.com)
- Pricing
- ByMykel/counter-strike-price-tracker — Steam Community Market, USD, cents → dollars
- Price snapshot
- Aug 8, 2026, 06:46 AM UTC (cached, committed at build)
- Price coverage
- 93.4% of reachable (skin, wear) combinations
- Dataset built
- Sep 8, 2026, 01:28 AM UTC · 42 weapon cases
Data is fetched and normalised by npm run build:data and committed to the repo — no external calls happen at page-load time. Prices are estimates and exclude marketplace fees; thin markets may be missing entirely and are excluded from expected-value maths.
Assumptions the simulator makes
- Opening cost = current case price + key price. Non-marketable keys use the $2.50 store price.
- Skins within a rarity tier are equally likely.
- StatTrak is an independent 10% roll; float is uniform in raw space.
- P(wear) is the fraction of a skin's float range inside each wear band.
- Values are Steam snapshot mid prices, not net of fees, and can be stale.
- Expected value excludes any outcome with no price in the snapshot.