Real cryptographic randomness
Every character comes from
crypto.getRandomValues() with rejection sampling, so
there is no modulo bias and no predictable seed — unlike
generators built on Math.random().