Four twelve-sided dice carrying the numbers 1–48, one number each.
Everyone takes a die, everyone rolls once, and you read the turn order
straight off the table: highest goes first, then second, and so on.

Two things make that work, and only the second one is hard.
No ties, ever. Every number appears exactly once across the four
dice, so two players physically cannot roll the same value. There is no
re-roll rule because there is nothing to re-roll.
Every ORDER is equally likely. Not the weak claim that each player
wins a quarter of the time — the strong one: each of the 24 possible
finishing orders comes up with probability exactly 1/24 (864 of the
20 736 possible rolls). Your chance of 1st, 2nd, 3rd and 4th is 25%
each, and it stays 25% whichever die you pick up. Hand them out any way
you like; nobody can be cheated by choosing well.
The same holds for any subset, so a three-player game just leaves one
die in the bag, and a two-player game uses two. No renumbering.
Why this isn't obvious
Making four dice that each win 25% of the time is easy — number them
1–12, 13–24, 25–36, 37–48 and you're done. That set is also wildly
unfair: the 25–36 die comes third far more often than it comes second.
Fixing every finishing place at once is a genuine combinatorial
constraint, and four d12 is the smallest set that satisfies it (Eric
Harshbarger and Robert Ford, ~2010). You cannot eyeball whether a
numbering works — a single transposed digit produces a set that still
has no ties, still has all 48 numbers, still sums to 49 on opposite
faces, and is silently unfair. So the numbering here is not trusted: a
solver enumerates all 20 736 rolls and checks every subset, and the
build refuses to export anything unless it passes.
The dice — four DIFFERENT prints
| STL |
faces |
go_first_die_a.stl |
1 · 8 · 11 · 14 · 19 · 22 · 27 · 30 · 35 · 38 · 41 · 48 |
go_first_die_b.stl |
2 · 7 · 10 · 15 · 18 · 23 · 26 · 31 · 34 · 39 · 42 · 47 |
go_first_die_c.stl |
3 · 6 · 12 · 13 · 17 · 24 · 25 · 32 · 36 · 37 · 43 · 46 |
go_first_die_d.stl |
4 · 5 · 9 · 16 · 20 · 21 · 28 · 29 · 33 · 40 · 44 · 45 |
Printing _a four times gives you four identical dice and constant ties
— the opposite of the point.
Each die is 18 mm across the flats, and its own opposite faces sum to 49
(the usual mass-balance convention for a fair die).

Why 6, 9 and 10 are underlined
A pentagon rests in five orientations and the die gets read from wherever
you happen to be sitting, so a numeral that reads as a different value
in the set when turned over has to say which way is up. That list is
derived rather than assumed — every value's digits are rotated through
{0:0, 1:1, 6:9, 8:8, 9:6} and the collisions reported:
6 reads as 9 9 reads as 6 10 reads as 1
16, 18 and 19 rotate to 91, 81 and 61, which are outside 1–48, so they
need nothing.
Colour
- Single colour — print the four dice. The numerals are 0.6 mm
recesses: leave them, or paint-fill them.
- Two colour (AMS) — import a die and its matching
_digits.stl in one file-open action, answer yes to "load as a
single object with multiple parts", then assign a filament to each.
Do not use Split-to-Parts here: Bambu splits by connected
component and the inlay is ~22 separate glyph islands ("48" alone is
two numerals plus the counters inside them), so you'd be colouring 22
parts by hand.

Print
- No supports, no brim — a dodecahedron rests on a whole pentagon
(93 mm² of bed contact), unlike a d20, which balances on an edge.
Above the base round-over the steepest surface is 32°.
- ≥40% infill. Uneven infill is the main thing that makes a printed
die roll badly, and this one is asked to be fair.
- 0.2 mm layers, 0.4 mm nozzle.