De dónde sale la aleatoriedad
Cada carácter viene de crypto.getRandomValues, el generador criptográfico del propio navegador. Math.random es rápido y sirve de sobra para barajar una lista; no sirve para nada que alguien pueda intentar adivinar.
El sorteo usa muestreo por rechazo en lugar de doblar con un resto, así que ningún carácter del conjunto es una fracción más probable que otro.