De onde vem a aleatoriedade
Cada caractere vem do crypto.getRandomValues, o gerador criptográfico do próprio navegador. O Math.random é rápido e serve perfeitamente para baralhar uma lista; não serve para nada que alguém possa tentar adivinhar.
O sorteio usa amostragem por rejeição em vez de dobrar com um resto, por isso nenhum caractere do conjunto é uma fração mais provável do que outro.