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.