How randomness works
We use the Web Crypto API (crypto.getRandomValues()) to generate uniformly distributed integers. When unavailable, we fall back to Math.random() with a visible warning.
- No server-side state — rolls happen in your browser.
- Optional “exploding” dice are re-rolled when the max face appears.
- Keep/Drop logic is applied after all base (and exploding) rolls are collected.