Coin Flip
crypto.getRandomValues · 50/50 · in-browser
crypto.getRandomValues — the browser’s
cryptographically secure RNG — before the coin is tossed,
so the toss is purely cosmetic and the result is provably 50 / 50.
Tap the button, change the labels, or batch—flip a thousand at once.
Why the result is fair
A coin’s outcome here is one bit drawn from
crypto.getRandomValues: the page reads a fresh 32-bit unsigned
integer and treats its low bit as “heads” (0) or
“tails” (1). On every modern browser that integer is sourced
from the operating system’s cryptographic entropy pool — the
same one used to generate TLS session keys. Because each bit is
independent and uniformly distributed, every flip is a true 50 / 50 with no
memory of prior results.
The animation is cosmetic
The heads/tails decision is made before the coin starts spinning — the rotation amount and final orientation are picked so the coin lands with the predetermined face up. So the animation is fun to watch but cannot affect the outcome, and the outcome cannot be biased by any interaction with the toss (no clever button-mashing exploit).
Batch mode and the law of large numbers
Click ×100 or ×1000 and a whole batch is flipped
at once. The page animates a single representative coin (showing the last
result) and renders the rest as small chips below. Aggregate statistics
(total, heads %, longest run) update across your whole session, so you
can watch the heads share converge on 50% as N grows, and see the
occasional improbable streak — runs of 10+ same-side flips do happen
and are not a bug.
Customizing the labels
The two text fields control what appears on the heads and tails faces. Use them for binary decisions where “heads/tails” isn’t the right framing — Yes / No, Stay / Go, Burrito / Pizza. Long labels auto-shrink to fit the face. The statistics panel relabels itself to match.
Privacy
No flip is ever sent off the page. The history and statistics live only
in this tab’s memory and disappear when you close it (there is no
localStorage persistence here). The page makes no network
requests after the initial static load, and there are no analytics
scripts.