Zufallsbuchstabe in C
-
Hallo,
ich versuche ein Programm zu schreiben, welches mir einen Zufälligen Großbuchstaben ausgibt.
Jedoch weis ich nicht wirklich wie ich das anstellen soll.
Mein erster Gedanke war folgender:
In der ASCII-Tabelle sind die Großbuchstaben ja als HEX-Zahl von 65 bis 91 definiert. Daher denke ich mir, es könnte funktionieren wenn ich mit der Funktion "rand()" eine Zufallszahl zwischen 65 und 91 erzeuge. Jedoch weis ich nicht wie ich so eine Zufallszahl zw. diesen zwei Intervallen erzeugen soll (Modulo-Division?).
Sollte dies irgendwie zu bewerkstelligen sein stellt sich ja die Frage, wie ich dem Computer sagen soll das A=65, B=66 usw ist. Switch-Case ist da ja ziehmlich umständlich.
Vielleicht könnt Ihr mir ja weiterhelfen. Wenn es eine einfachere Methode gibt, bitte sagen.
Wäre für Eure Hilfe sehr dankbar!
-
janisch_htl schrieb:
In der ASCII-Tabelle sind die Großbuchstaben ja als HEX-Zahl von 65 bis 91 definiert.
Bis 90, beides inklusive.
janisch_htl schrieb:
Daher denke ich mir, es könnte funktionieren wenn ich mit der Funktion "rand()" eine Zufallszahl zwischen 65 und 91 erzeuge. Jedoch weis ich nicht wie ich so eine Zufallszahl zw. diesen zwei Intervallen erzeugen soll (Modulo-Division?).
Versuch mal, eine Zufallszahl von 0 bis 25 zu erzeugen, und dann 65 zu addieren.
-
Hallo,
wenn es nicht auf den perfekten Zufall ankommt, hilft vieleicht diese schnelle Lösung:
char c = rand() % 25 + 65; printf( "%c\n", c );
mfg Martin
-
Ich glaube, %26 war gemeint.
-
Hallo,
vielen dank für Eure Hilfe! Funktioniert jetzt so wie ich es mir vorgestellt habe.
-
Du hast das ja schon passend, das du nicht immer den gleichen "Zufall" hast?
Tip für nicht so geübte: Programme mit Zufallszahlen immer mehrfach testen.
-
f.-th. schrieb:
Du hast das ja schon passend, das du nicht immer den gleichen "Zufall" hast?
Was will mir dieser Satz sagen?
-
Es würde im übrigen die Lesbarkeit erhöhen wenn man nicht mit 65 um sich wirft sondern das konsequentere 'A' bevorzugen würde.
Ansonsten ist es vielleicht auf den ersten Blick tollrand() % 25 + 'A'
zu schreiben, aber imho geschickter ist es sich ein eigenes Alphabet zu definieren, z.B.:char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ... foo = alphabet[rand() % sizeof alphabet];
Hat halt den Vorteil, dass man nicht rumfrickeln muss sobald man mal ein Alphabet aus nicht-nur Großbuchstaben hat. Ist auch portabel (auch wenn das in dem Fall nicht wirklich relevant ist).
-
Tim schrieb:
rand() % 25 + 'A'
oder sogar
rand()%('Z'-'A') + 'A'
oder falls einen die 25 doch noch stört
rand()%('Z'-'A'+1) + 'A'
-
touché
-
Nebenbei: der schöne Ausdruck von volkard ist nur gültig, weil C garantiert, dass die Buchstaben aufsteigend ihren Zahlenwerten zugeordnet sind. Dass 'A' bei 65 liegt, ist aber nicht garantiert. Tims Ansatz ist allgemeiner, und eine Spur schneller, weil die Addition wegfällt; der Geschwindigkeitsgewinn sollte aber selten spürbar sein.
janisch_htl schrieb:
Sollte dies irgendwie zu bewerkstelligen sein stellt sich ja die Frage, wie ich dem Computer sagen soll das A=65, B=66 usw ist. Switch-Case ist da ja ziehmlich umständlich.
Falls dir das nicht ohnehin schon klar geworden ist: zwischen Zahlen und Buchstaben macht C keinen Unterschied. Die Buchstaben sind Zahlen:
int i = 'A'; /* i hat den Zahlenwert von A (65 bei ASCII) */ char c = 65; /* c hat den Buchstaben zu 65 ('A' bei ASCII) */ putchar(i + 25) /* gibt 'Z' aus */ putchar(c + 25) /* gibt auch 'Z' aus */
-
volkard schrieb:
Ich glaube, %26 war gemeint.
Korrekt.
mfg Martin