2013-11-01 12 views
6

Sono nuovo alla programmazione in C e mi è stato assegnato il compito di creare un array 2D che memorizza lettere casuali da A-Z utilizzando la funzione random(). So come fare numeri casuali.genera caratteri casuali in c

nextvalue = random () % 10001; 

ma non sono sicuro di come esattamente creare un carattere casuale. So che è possibile utilizzare ASCII per creare un carattere casuale utilizzando l'intervallo 65 - 90 nella tabella ASCII. Qualcuno può aiutarmi a trovare una soluzione? Lo apprezzerei molto

risposta

24

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 ...

+0

La seconda alternativa è più interessante della prima, poiché è portatile * e * utilizza l'indicizzazione di matrice su una stringa letterale che è sempre divertente. – unwind

+1

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

+0

@JeremyP: per curiosità, qual è il tuo sistema e di quale documentazione stai parlando? –

1

Penso che tu abbia già risolto questo problema. Hai solo bisogno di pensare più forte e armeggiare di più con esso. In C è possibile visualizzare facilmente qualsiasi carattere ASCII in formato Dec. Ecco lo ASCII Table come riferimento. Per esempio

char c = 65; 
char c = 'A'; // Both are the same thing. 

quindi probabilmente è la stessa di generare un numero casuale compreso tra 65 e 90. Spero che questo aiuti;) Sono anche nuovi a C con una certa esperienza in C++.