— TRANSPARENCY
PROVABLY FAIR
Every card pull on TCGRoll uses a weighted random algorithm with published drop rates. There are no hidden modifiers, no pity manipulation, and no changes to rates after you open a case. This page explains exactly how it works.
HOW IT WORKS
- 1
Drop rates are published
Every case lists the exact drop rate for each card — visible before you spend a single token. Nothing is hidden.
- 2
A random number is drawn
When you open a case, the server calls Math.random() (Node.js CSPRNG, seeded by the OS) to generate a number between 0 and the total weight of all cards in the pool.
- 3
Weighted selection picks the card
The algorithm walks the card pool, subtracting each card's drop rate until the value reaches zero or below. That card is returned. Cards with higher drop rates occupy more of the range and are proportionally more likely to be selected.
- 4
The result is recorded
The pulled cards are written to the database immediately before being shown to you. The server state is the source of truth — not the animation.
THE ALGORITHM
This is the exact function used in production, unmodified:
function weightedRandom(cards) {
// Sum all drop rates (e.g. 60 + 25 + 10 + 4 + 1 = 100)
const totalWeight = cards.reduce(
(sum, c) => sum + c.dropRate, 0
)
// Draw a random number in [0, totalWeight)
let random = Math.random() * totalWeight
// Walk the pool — subtract each card's weight.
// The first card that brings random to ≤ 0 wins.
for (const caseCard of cards) {
random -= caseCard.dropRate
if (random <= 0) return caseCard.card
}
// Fallback (floating-point edge case only)
return cards[cards.length - 1].card
}A card with a 60% drop rate occupies 60 units of the range. A Legendary with 1% occupies 1 unit. The probability of landing on any card equals dropRate / totalWeight.
EXAMPLE DROP RATES
A typical Standard case might look like this. Each case page shows its exact rates.
LIVE SIMULATOR
Run the exact same algorithm used in production. Verify the distribution yourself.
QUESTIONS?
If you believe you've experienced anomalous results, contact us with your opening ID (visible in your profile transaction history) and we'll investigate.