Si dovrebbe assumere qualcosa sulla codifica dei caratteri del proprio sistema. Supponiamo che sia ASCII o UTF-8 e ci limitiamo alle 26 lettere maiuscole ABC ... XYZ dell'alfabeto latino.
allora si potrebbe codificare:
char randomletter = 'A' + (random() % 26);
Questo non funziona su EBCDIC. Si potrebbe anche provare
char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random() % 26];
che funziona con qualsiasi codifica (tra cui EBCDIC, ASCII, UTF-8, ISO-Latin-1) .... dove ogni A. ..Z lettera è codificata da un singolo char
.
Ma this è una risposta interessante che spiega perché random() % 26
è sbagliato. Nella mia ingenua visione non esperta, è abbastanza buono.
Sostituzione random() % 26
da myrandomlt26()
dove abbiamo definito
static inline unsigned myrandomlt26() {
long l;
do { l = random(); } while (l>=(RAND_MAX/26)*26);
return (unsigned)(l % 26);
}
dovrebbe essere un po 'meglio (Molto spesso il ciclo do
... while
sopra dovrebbe essere eseguito una sola volta).
Tuttavia, ulteriori informazioni, ad es. a proposito di Unicode, scoprirai che ci sono alcune lingue umane in cui la nozione stessa di lettera (o maiuscola) non è così banale come credi.
Non sono un esperto in materia, ma la leggenda urbana dice che stranamente il francese œ
non è una lettera (ma solo una legatura) perché il rappresentante francese in alcune riunioni ISO era malato quando è stato discusso. Alla scuola francese, ricordo di aver appreso (probabilmente nel 1966-1972) che non è una lettera (ma non la scrittura manuale della legatura - che ha un nome speciale "E dans l'O" in francese - era una spelling errore), ma alcune persone credono il contrario. Solitamente lettere accentate come é
o à
sono considerate lettere in francese (ma la loro codifica UTF-8 richiede diversi consecutivi char
....). Allo stesso modo credo e ho imparato che il cirillico soft-signь
è non una lettera, anche se sembra uno. Definire cosa è una lettera in arabic, hebrew, korean, cherokee, thai ... dovrebbe anche essere divertente e questione di interminabili dibattiti ...
La seconda alternativa è più interessante della prima, poiché è portatile * e * utilizza l'indicizzazione di matrice su una stringa letterale che è sempre divertente. – unwind
Sì 'random()% 26' non dà un risultato uniformemente distribuito. Tuttavia, supponendo che 'RAND_MAX' sia 2147483647, i numeri da 0 a 23 hanno una possibilità in più di essere prelevati ma il bias è piuttosto piccolo. Il problema più grande è se c'è un ciclo nascosto nella sequenza che viene esposta modding con 2 o 13. Sul mio computer la documentazione dice no. – JeremyP
@JeremyP: per curiosità, qual è il tuo sistema e di quale documentazione stai parlando? –