Liar's DiceDudo · five dice a player · aces wild

your cup

Your hand

Your call

1

this call: -

on the table: -

Keys: ↑↓ quantity, 1-6 rank, Enter to call, D for dudo, C for calza.

The rules this plays

LD-1, the shipped ruleset, in full

There is no single standard Liar's Dice. Neller & Hnath, who formalised the game for a 2011 computer-science paper, say so outright: “Although a single, standard form of the game has not emerged”. So this app names its ruleset instead of pretending. LD-1 follows the Compendia rules sheet that the Wikipedia article on Dudo cites (the page is dead; it was read from the Internet Archive snapshot that Wikipedia's own reference links to).

  1. Two to six players. Everyone starts with five six-sided dice and a cup.
  2. Each round every player shakes and looks at their own dice, hidden from everyone else.
  3. The opener calls a quantity and a rank: “five threes” claims that at least five dice on the whole table show a three.
  4. Aces are wild. A die showing 1 counts towards every rank. So a die counts towards a rank of 2–6 with probability 2/6, and towards a rank of 1 with probability 1/6.
  5. You may not open a round on aces unless you are down to one die.
  6. A higher call is exactly one of three things:
    • the same quantity of a higher rank (“eight 4s” → “eight 5s”);
    • a higher quantity of the same rank (“eight 4s” → “nine 4s”);
    • at least half the quantity, rounded up, in aces (“eight 4s” → “four aces”).
    Leaving aces again costs double plus one: “four aces” → “nine 2s” or higher.
  7. Dudo ends the round. Cups up, count the rank and the aces. If the call was good the doubter loses a die; if it was short, the caller loses a die. One die, either way.
  8. Calza claims the standing call is exactly right. Right, and you take a die back (never above five); wrong, and you lose one. The calza player opens the next round.
  9. Palifico. The first time a player is cut down to one die, they open the next round and that round is played with aces dead and the rank frozen by the opening call. Only another player who is also down to one die may move the rank.
  10. The loser of a round opens the next one; if they were knocked out, the player to their left does. Last player with dice wins.

Two other rulesets ship as alternatives in the picker, and they are genuinely different games, not cosmetic switches — see the next section.

Where the published rules disagree

Four contradictions between sources, and a fifth the sources leave blank

These are not variants this app invented. Each row is two or more published sources saying incompatible things about the same situation.

QuestionCompendia (LD-1)Wikipedia, “Dudo” (LD-W)Neller & Hnath / Knizia (LD-2)
May a raise in quantity also change the rank? No. Its list of higher calls is exhaustive and contains no such case: “eight 4s” → “nine 2s” is illegal. Yes, explicitly: “If a player increases the quantity, they can choose any number e.g. a bid may increase from 'five threes' to 'six twos'.” Yes: claims are totally ordered by strength, and “2×4 may be followed by … 4×3”.
What does it cost to switch to aces? Half, rounded up. “eight 4s” → “four aces”. Same: “halve the quantity of dice, rounding upwards”. Different. n×1 immediately precedes 2n×2, so four aces sits just below eight 2s, which is below eight 4s — after “eight 4s” four aces is not a raise at all. You would need five aces.
And back out of aces? Double plus one: four aces → nine 2s. Same: “one more than double the previous quantity”. Different. Plain double: four aces → eight 2s is the very next claim.
How many dice does a lost round cost? Exactly one. Exactly one. The difference. Claim seven 6s, count ten, and the doubter loses three. Count five, and the claimant loses two. Exactly right, and every other player loses one.
When does palifico start? When a player is reduced to one die. Records both, unreconciled: “In some versions, when a player first reaches one die … In some other versions, the palo fijo happens on a player reaching their last two dice”. Both “palo fijo” and “palo ciego” carry citation-needed tags dated May 2025. No palifico at all.
What does a wrong calza cost? One die. Undefined on purpose: “the claimant loses one or two dice, depending on the agreed upon rules”. No calza.

A gap none of the sources fill

In a palifico round aces are not wild and, Compendia says, “can be called as if an ordinary number”. No source I found says where rank 1 then sits in the order, and that matters the moment a second single-die player wants to move the rank. LD-1 places it at the bottom (1 < 2 < … < 6) and suspends the halving arithmetic for the round. That is a reconstruction, not a rule anyone published.

One place this app knowingly departs from Compendia

Compendia gives calza to “any player except the one whose turn it is to call” — an out-of-turn interrupt. Wikipedia's Dudo article instead lists “Spot on” as a third thing you may do on your turn, beside raising and doubting. This app implements the on-turn version, because an out-of-turn interrupt has no meaning when four of the five players are software. That is a deliberate deviation and it is the only one.

And one the game itself does not settle

No source says whether you may call a quantity larger than the number of dice on the table. LD-1 caps the quantity at the dice in play, which is also Neller & Hnath's claim space. The practical effect is that a player at the very top of the ladder has no legal raise and must doubt.

How the dice are rolled

A simulated die, and what it takes to make one fair

Every die in this game — yours and the ones under the bots' cups — is thrown by a rigid-body simulator written for this app: a 19.05 mm cube (the size the gaming regulations quote for precision casino dice), gravity at 9.80665 m/s², impulse contacts against a flat table with restitution 0.36 and Coulomb friction 0.34, integrated at 1/2000 s. A throw makes about 11.4 table contacts and settles in about 0.57 s. There is no random number picking the face: the face is whatever the cube lands on.

A cube's inertia tensor is isotropic, so a tumbling die has no torque about its centre and spins about a fixed axis at a constant rate the whole time it is airborne. The simulator uses that: the airborne arcs are solved in closed form and only the neighbourhood of the table is stepped. The harness checks that shortcut against stepping the same flight in 600 pieces — they agree to 4×10-15 m in position.

Two properties, not one

A die has to be fair (each face 1/6) and unpredictable (you cannot aim it). Those are different properties with different causes, and this app measures them separately.

Fairness: measured

2,000,000 simulated throws. The face the die lands on:

face slot+X−X+Y−Y+Z−Zchi-square (5 d.f.)p
count332,840332,541334,284333,312333,370333,6535.640.34
pip value334,051333,570332,943333,665333,318332,4534.830.44

Uniform, as far as two million throws can see. A separate 40,000-hand test confirms that hands of five simulated dice follow Binomial(5, 1/3) for a wild-boosted rank (chi-square 5.36 on 5 d.f.).

The claim this app set out to test, and could not reproduce

A common assumption, and this app's starting hypothesis, is: “A symmetric die should land each face with probability 1/6 however it is thrown.” That is false, and the measurement is not close. Symmetry of the solid buys equivariance, not uniformity: it says the set of throws landing on face i is the rotated image of the set landing on face j. Turning that into “1/6 each” needs a second thing — that the distribution over release orientations is itself invariant under the cube's 24 rotations. A shaken cup supplies it. A steady hand does not.

Here is the same geometrically perfect cube, thrown from one fixed release orientation with a Gaussian wobble of standard deviation σ on the velocity (and 10σ on the spin), 40,000 throws per row:

σ (m/s)most common facechi-square (5 d.f.)verdict
0100.0%200,000one face, always
10-4100.0%200,000one face, always
10-397.0%185,863still effectively loaded
3×10-373.7%102,449loaded
10-258.5%55,180loaded
3×10-233.8%9,510loaded
10-118.4%525still not fair
3×10-118.1%96.8still not fair (p ≈ 10-18)

At the bottom row the velocity is being wobbled by as much as the whole throw speed — and the distribution is still detectably biased, because the orientation never changed. Wobbling the arm does not make a die fair; turning the die over does. That is what the cup is for, and it is why the game's own throw draws the release orientation uniformly on SO(3).

Fairness, guaranteed rather than measured

The app does not rely on that measurement. The 24 rotations of a cube carry each face to each of the six faces exactly 24 / 6 = 4 times, so if the mapping from face slot to pip value is drawn uniformly from those 24, every pip value comes up with probability exactly 1/6 — for any throw, with no sampling error at all. That is a counting argument, not a statistic, and the harness checks the count for all six slots.

It also checks that the guarantee is not decorative. Against the shipped throw it is inert, because the geometric distribution is already uniform and then every labelling gives uniform pips. Against the fixed-orientation throw above — 12,000 rolls, geometric chi-square 60,000, one face every time — the pip distribution comes out at chi-square 3.74. Remove the labelling randomisation and it goes back to 60,000; draw it from only 4 of the 24 rotations and it is 24,000.

Unpredictability: measured, and it is dynamical

Perturb one number in the release by ε and ask how often the face changes. Two throws with nothing in common change face 5/6 = 83.3% of the time, so the decorrelation scale ε* is taken as the ε at which the flip rate reaches half of that, 41.7%. 3,000 throws per cell, fifteen decades per parameter:

release parameterε*as a fraction of the throw
sideways position xnone — no ε changes anythingexactly zero sensitivity
sideways position ynoneexactly zero sensitivity
release height z1.6×10-4 m0.8% of the die's edge
vertical velocity9.2×10-4 m/s≈0.3% of the launch speed
tilt of the die in the hand2.4×10-3 rad0.14°
horizontal velocity1.4×10-2 m/s≈1.3% of the launch speed
spin about any axis2.4–2.8×10-2 rad/s≈0.09% of the spin rate

Two things fall out of that table. First, the sensitivity is not uniform across the throw parameters — the vertical ones are about fifteen times sharper than the horizontal ones. Second, two of them do nothing at all: the table is a plane, so sliding the whole throw sideways translates the trajectory and changes no contact. Shifting a throw a full metre sideways changed the face 0 times in 45,000 throws. That is an exact symmetry, and it is what lets this app place five dice side by side on the felt by translating each throw — the placement provably cannot bias the result.

Where the unpredictability comes from

It comes from the bounces, and you can turn it up and down. Restitution is the only thing changed in this table — the die, its mass, the gravity and the distribution of throws are identical:

restitutionmean table contactsε* on vertical velocity
0.004.65.8×10-2 m/s
0.105.81.8×10-2
0.207.65.9×10-3
0.36 (shipped)11.69.1×10-4
0.5519.48.1×10-6
0.75does not settle inside the 8 s budget — no figure quoted

Four and a half decades of sensitivity bought purely by bouncing more. Fitted across that range, ε* falls by a factor of about 1.8 per table contact. At the shipped restitution, 11.6 contacts multiply an initial uncertainty by roughly 103 — not 1015. A real die is unpredictable because a human release varies by far more than 10-3 m/s, not because the die is infinitely chaotic. Holding restitution fixed and binning throws by contact count gives a weaker slope (ε* 2.5×10-2 at 8 contacts, 6.6×10-3 at 14), because at a fixed table a throw that bounces more is also a gentler throw.

That finite amplification has a visible consequence. Rotating the die 180° in the hand is an exact relabelling, so the face must come out permuted — and it does, in 11,995 of 12,000 throws, bit for bit, even though the intermediate arithmetic differs in the last place. The five exceptions are throws that finish within about 10-13 of a basin boundary. A die that amplified like a weather model would fail that test every time.

A die that is perfectly fair and completely useless

Lower the die from just above the cloth with no spin and a dead-inelastic table. It cannot tumble, so it lands on the face that was already down. Draw the release orientation uniformly and the result is exactly fair: 20,000 drops, chi-square 2.06 on 5 d.f. It is also 100.00% predictable — every single outcome was readable off the release before the die was let go. Fairness and unpredictability really are separate properties, and this is the cleanest case of one without the other.

The odds, and how they are checked

Exact binomial tails, against brute force

Wikipedia states the law: the number of dice showing a particular face among n unknown dice is Binomial(n, 1/6). With aces wild a die counts towards a rank of 2–6 with probability 2/6 and towards a rank of 1 with probability 1/6 — ones occur at half the frequency of a wild-boosted rank, which is the whole reason every ruleset has special arithmetic for bidding aces. The percentages under the bid picker are those tails, conditioned on the dice you can see.

The floating-point implementation is checked two independent ways, neither of which reuses it:

  • Brute force. Every hand of n dice is enumerated for n = 1…8, wild and non-wild — 4,031,076 hands — and every tail and point probability is counted rather than computed. Worst disagreement: 2.4×10-15.
  • Exact rationals. The same quantities in BigInt integer arithmetic, with no floating point anywhere: 3,069 comparisons, worst disagreement 7.9×10-15.

A published rule of thumb, tested

Wikipedia adds: “A bid of the expected quantity (or twice the expected value when playing with wilds), rounded down, has a greater than 50% chance of being correct and the highest chance of being exactly correct.” Its only citation is a paper I could not read (see below), so it was tested from first principles in exact integer arithmetic for every n from 1 to 60, wild and plain — 120 cases. Both halves hold in all 120. With one qualification the source does not give: in 30 of the 120 the floor-of-the-mean bid is only tied for most likely, not uniquely best. And the rule is not a general fact about binomials — it survives because 1/6 and 1/3 are reciprocals of whole numbers, which makes the floor jump exactly where the mode ties. At p = 0.3 with n = 3 the same recipe gives a bid that is not the mode at all. That control is in the harness.

One more caveat the source omits: the formula is about unknown dice, but a bid is about every die on the table, including the five you are looking at. The readout in the game conditions on your hand; the rule of thumb does not.

What the harnesses caught

Bugs found, instruments validated, and what is still open

Three instruments, sharing no code with each other or with the engine: oracle A enumerates every hand by brute force, oracle B computes the same probabilities in exact BigInt rationals, and oracle C is a second, independently written adjudicator that re-decides every bid, challenge, loss and round transition. The engine harness runs 249 assertions; the page harness checks the shipped files.

Bugs these caught

  1. The integrator dropped a ½g·dt² term. Plain semi-implicit Euler puts the die 0.7 mm off over a 0.3 s flight at dt = 1/2000 — 3.5% of the die's edge, and enough to change the face about half the time. Found by demanding that the closed-form free-flight step agree with stepping the same flight; the gap was 1.1×10-3 m and is now 4.4×10-15.
  2. The simulation overshot its own time budget by up to one step, which made any two runs with different timesteps incomparable.
  3. Resting dice never fell asleep. The first contact model tested for actual penetration, so a die at rest chattered against the table at the velocity one timestep of gravity gives it and burned the whole 8 s budget: 92% of throws never settled, at 465 contacts each. A contact band plus fully inelastic micro-bounces fixed it; throws now settle in 0.57 s after 11.4 contacts, and the simulator got twenty times faster.
  4. A mutant that could not be caught, which turned out to be the interesting result. The 24-fold labelling randomisation was supposed to be provable by breaking it. Breaking it changed nothing — because when the geometric face distribution is already uniform, every labelling gives uniform pips. The guarantee is real but inert for the shipped throw; it only bites on throws whose geometry is biased, and that is where it is now tested.

Instruments validated before they were trusted

  • Every oracle is checked on inputs small enough to count by hand before being pointed at the engine.
  • 11 deliberately broken engines — ace halving rounded the wrong way, wilds not counted at the reveal, the wrong player charged for a dudo, palifico firing every time, an eliminated player left in the game, and so on. Oracle C caught 11 of 11, and raises nothing against the engine as shipped.
  • 3 broken probability layers (an off-by-one tail, wilds priced at 1/6, a broken binomial coefficient). Oracles A and B caught 3 of 3.
  • 11 rewrites that are provably the same engine — ceil(q/2) as floor((q+1)/2), the legal-move list reversed, seats walked backwards, a histogram in place of a scan. All 11 raised zero flags. An instrument that only ever fires is a smoke alarm with the battery taped down.
  • All 44 triangles of the die mesh are audited for outward normals two ways, and the audit is re-run on three deliberately broken copies. The one that matters is the inside-out mesh, where winding and normals are both reversed so the mesh stays self-consistent: the winding test cannot see it and the outward test catches all 44.
  • 1,500 complete games across nine rule configurations were re-adjudicated move by move by oracle C, with zero disagreements.

Still open

  • Equivariance under an exact 180° relabelling holds in 11,995 of 12,000 throws, not 12,000. The five exceptions land within about 10-13 of a basin boundary, where a one-ulp difference in a square root is enough. I have not chased them further.
  • At restitution 0.75 the contact model does not settle inside the 8 s budget, so no decorrelation scale is quoted for it. The shipped value is 0.36 and is well inside the stable range.
  • The per-contact amplification figure (about 1.8×) is fitted across a restitution sweep, where restitution changes both the number of contacts and their character. Binning by contact count at fixed restitution gives a weaker slope. The two are not the same experiment and I have not separated them.
  • The bots price bids with exact binomial tails and bluff at a fixed rate. They are not solved play; Neller & Hnath's CFR work is what solved play looks like, and this is not that.

Limits

What this model does not do
  • Dice do not collide with one another. Each die is simulated alone against the table and then slid into place. The model makes that slide provably free of bias, but a real cup throw has five dice knocking into each other.
  • No cup. The throw starts in mid-air with a released velocity and spin. There are no cup walls, and no shaking.
  • No air. Over a 0.57 s flight of a 19 mm cube, drag would change the trajectory by far less than the contact model's own uncertainty, so adding it would be false precision rather than more physics.
  • The die is geometrically perfect and has no pips. Real drilled pips remove mass, which is exactly why precision casino dice fill them with density-matched epoxy. The pips you see are drawn on; they carry no weight.
  • The table is an infinite frictionless-edged plane. No rails, no cloth weave, no dice bouncing off a wall.
  • Restitution, friction, spin damping and the release distribution are calibrated to produce throws that look and settle like real ones. They are not measured from any real die, and CREDITS.txt tags every one of them CALIBRATED.

Corrections

Three claims this app checked, and what happened to each
  1. Falsified — a common assumption and this app's own starting hypothesis, not a published source. The hypothesis: “A symmetric die should land each face with probability 1/6 however it is thrown.” A geometrically perfect cube thrown from a fixed release orientation landed on one face 40,000 times out of 40,000; at a velocity wobble of 0.3 m/s, as large as the throw itself, it was still biased at chi-square 96.8 on 5 degrees of freedom. Symmetry gives equivariance. Uniformity needs the release orientation to be randomised, which is what the cup does.
  2. Upheld, with a qualification the source does not give. Wikipedia's “a bid of the expected quantity … rounded down, has a greater than 50% chance of being correct and the highest chance of being exactly correct” holds in all 120 cases tested in exact integer arithmetic — but in 30 of them the bid is only tied for most likely, and the rule works because 1/6 and 1/3 happen to be reciprocals of whole numbers, not because of anything general about binomial distributions.
  3. Imprecise, in a published source. Wikipedia's Dice article says “the symmetry of the die is broken when it is thrown, effectively yielding a random number”. Throwing a die does not break its symmetry — the symmetry of the solid is the one thing a throw cannot touch, and it is what makes the die fair at all. What a throw does is spread the distribution of release conditions across the basins. The sentence has the mechanism backwards.

Corrections 2 and 3 are about published sources; correction 1 is about this app's own starting hypothesis. None of the three is a correction of folklore.

Provenance

Where every figure came from

33 documented 6 documented, of something adjacent 18 measured here 9 derived here 8 calibrated 6 reconstructed 80 entries in total

qualified marks something that is documented, but of an adjacent object: the 19.05 mm edge is the casino craps die dimension and no source gives a size for a Liar's Dice set; the chamfer follows a description of backgammon dice; the Diaconis & Keller entry is a bibliography line, not the paper. Counting those as DOCUMENTED would flatter the tally, so they are counted apart. Every entry is listed line by line, with its source, in CREDITS.txt.

Sources I could not open

  • Ferguson & Ferguson, “Models for the Game of Liar's Dice” (UCLA). Downloads at 4.9 MB and is a scan with no text layer at all. This is Wikipedia's only citation for its bidding rule of thumb, so that claim was tested here rather than quoted.
  • gambiter.com's Dudo page, one of the three external links on Wikipedia's Dudo article: it now 301-redirects to the site root and the page is gone.
  • BoardGameGeek's Perudo page, the first of those three links: HTTP 403 to any non-browser client.
  • pagat.com, usually the authority on traditional game rules, has no Liar's Dice, Dudo or Perudo page at all. Its only “Bluff” entry is a card game.
  • Diaconis & Keller, “Fair Dice” (1989), behind JSTOR. Everything this app says about the symmetry argument is derived and proved in its own harness, not quoted from that paper.
  • Knizia, “Dice Games Properly Explained” (1999), the printed source behind the LD-2 ruleset. Not held; used only as Neller & Hnath report it.
  • The Compendia rules page — the one Wikipedia cites for the rules — is dead. It was read from the Internet Archive snapshot that Wikipedia's own reference links to. The ruleset this app ships is therefore built on a page that no longer exists.

A date the sources disagree on

Wikipedia and Neller & Hnath both place the game's origin in the 15th century. Compendia's page tells the legend that Atahualpa refined it during his captivity after Pizarro's victory — which was in 1532, the 16th century. The two are not compatible, and the legend is told as a legend. Nothing in this app depends on either.

Credits

The original, and what this is not

Liar's Dice is a traditional game in the public domain. It is thought to come from the Inca Empire, around the 15th century, and to have reached Europe with the Spanish conquistadors. It goes by Dudo, Perudo, Cacho, Cachito, Dadinho, Bluff and Call My Bluff.

Commercial editions exist and none of them is reimplemented here: Milton Bradley published a Liar's Dice in 1987, and Richard Borg's Call My Bluff / Bluff, published by F.X. Schmid in 1993, won the Spiel des Jahres that year and placed third in the Deutscher Spiele Preis. This app uses no artwork, text, component design or trademark from any commercial edition. It implements the traditional rules from the published descriptions listed in CREDITS.txt, and it is not affiliated with, endorsed by or connected to any publisher of any commercial version.

What differs from the traditional game

  • The opponents are software that prices every bid with an exact binomial tail and bluffs at a fixed rate. There is no table talk, no tell and no eye contact — which is most of the real game.
  • Calza is offered on your own turn rather than as an out-of-turn interrupt. See the rules section; it is the only deliberate departure from the ruleset LD-1 otherwise follows.
  • Where rank 1 sits in the order during a palifico round is reconstructed, because no source says.
  • The “burn” option (revealing part of your hand and re-rolling the rest), which Wikipedia's Dudo article describes, is not implemented.
  • The common-hand, poker-style variant described in Wikipedia's Liar's dice article is not implemented; this is the single-hand game.
  • Dice are simulated one at a time and do not collide with each other.

Machine-readable notes are in llms.txt; the licence for this implementation is in LICENSE.txt.