How the dice are fair
Your roll is not drawn when you press. It is determined at UTC midnight by that day's secret and merely discovered. Once the day is over the secret is published, and anyone can recompute any roll from it, forever.
Nobody can predict tomorrow, because tomorrow's secret does not exist yet. And nothing can be gained by learning one early: you cannot reroll, decline, or time your entry into a better outcome, so the worst an early leak could do is spoil a surprise.
Check a roll
This runs in your browser, on the published secret, with the algorithm below. Nothing is sent anywhere.
The algorithm, exactly
This is normative. Anyone reimplementing it should reproduce our faces byte for byte.
- Message
- YYYY-MM-DD|<player_id>
- The UTC date and the canonical lowercase hyphenated uuid. The date is in the message even though the secret is already per-day, so a secret can never be replayed across days.
- Key
- That day's secret: 32 bytes, published as 64 hex characters.
- Stream
- HMAC-SHA256(secret, message)
- 32 bytes. If exhausted, the next block is
HMAC-SHA256(secret, message + "|1"), then"|2", and so on. A second block has never been needed; the rule exists so the behaviour is defined rather than undefined. - Dice, in this fixed order
- d4, d6, d8, d10, d12, d20
- Per die of n sides
- limit = 256 − (256 mod n); discard any byte ≥ limit; face = (byte mod n) + 1
- Rejection rather than plain modulo, because 256 is not a multiple of 6, 10, 12 or 20, so plain modulo would make low faces come up measurably more often on four of the six dice. Expected consumption is 6.1224 of the 32 bytes available.
| Die | Sides | Limit | Bytes rejected |
|---|---|---|---|
| d4 | 4 | 256 | 0.00% |
| d6 | 6 | 252 | 1.56% |
| d8 | 8 | 256 | 0.00% |
| d10 | 10 | 250 | 2.34% |
| d12 | 12 | 252 | 1.56% |
| d20 | 20 | 240 | 6.25% |
How the score follows from the faces
Every one of the 460,800 possible rolls is scanned against the same 166 badge rules. Within each family only the rarest badge you matched is charged for, and every one of those pays its own rarity:
EP(badge) = round(460 × weight × log2(1 ÷ P(badge))3)
EP(roll) = the sum of them
So a rarer badge is worth more than a commoner one of the same weight, exactly and checkably, and the rungs beneath the one that counted are still earned without being paid for twice. The weight is 1 for every badge that says something about the roll and 0.08 for the six per-die families, which say only which face came up: one member of each fires on every roll no matter what, so paying them in full made two thirds of an ordinary score a fee everybody paid alike.
EP runs from 9,993 on the most ordinary roll possible to 9,819,430 on the rarest, and every rung of the tier ladder including SSS is a percentile cut off that distribution. The scale is still lopsided and that is the formula being honest rather than a flaw: a badge occurring once in 460,800 rolls pays 3,063,276 by itself, so a median roll sits at half a percent of the maximum. Compare yourself against the percentile, never against the ceiling.
One thing a sum cannot do, said plainly because the mirror above rests on it: two rolls of identical probability need not score identically. Six ones and every die at its maximum are both exactly one in 460,800, and they score 9,819,430 and 5,640,404, because the first earns a deeper ladder of badges than the second. Both are SSS.
What publishing a roll costs you
The verifier needs a player id, and a shared roll page publishes yours. Day secrets are published once their day is over and are kept forever. So anyone holding a link to one of your rolls can recompute your faces for every closed day in Raredle's history, including days you never claimed.
We opened that door on purpose. A verifier only you could run would prove nothing to anyone else, which would leave the fairness claim existing only in this paragraph. Know that before you share.