2016-08-18 9 views
1

Ich versuche, ein Array von Groß- und Kleinbuchstaben gleichzeitig zu generieren.Logik hinter der Generierung zufälliger Groß- und Kleinbuchstaben

Ich verstehe die Logik hinter der Generierung von zwei getrennten Fällen von Buchstaben.

rand() % 26 + 65 // generate all the uppercase letter 

während

rand() % 26 + 97 // generate all the lowercase letter 

Ich habe versucht, googeln, wie beide miteinander zu erzeugen, und hier ist das, was ich erhielt.

rand() % 26 + 65 + rand() % 2 * 32 // generate both upper and lowercase letter 

Leider haben sie nicht genau die Logik dahinter erklären, und ich möchte nicht nur blind kopieren und ihn in meine Aufgabe einfügen. Nach der Logik hinter dem rand() % 2 * 32 beim Hinzufügen des zweiten rand() in den ersten rand() gesucht.

Jede Hilfe wird geschätzt.

+1

Dies ist nur langweilige Details der ASCII-Kodierung. Du kannst es eine Weile lang anstarren, bis es Sinn macht. –

+2

Zunächst sollten Sie magische Zahlen vermeiden. Zum Beispiel ist das erste Snippet besser als 'rand()% ('Z' - 'A' + 1) + 'A'' geschrieben. –

+0

Versuchen Sie zunächst, [* magische Zahlen *] zu vermeiden (https://en.wikipedia.org/wiki/Magic_number_ (Programmierung)). Wenn Sie den Buchstaben A meinen, dann sagen Sie es (wie in "A").Zweitens könnte das Lesen einer [ASCII-Tabelle] (http://en.cppreference.com/w/cpp/language/ascii) hilfreich sein. Es sollte auch darauf hingewiesen werden, dass Ihre Methode zur Generierung von Zeichen (obere, untere oder gemischte) nur auf Systemen funktioniert, die [ASCII] (https://en.wikipedia.org/wiki/ASCII) verwenden. Andere Kodierungen existieren noch, obwohl sie selten sind. –

Antwort

7

Beachten Sie, dass der 32 der Unterschied zwischen 65 und 97 ist, d. H. Der Unterschied zwischen ASCII-Codes von Groß- und Kleinbuchstaben.

nun die nehmen lassen rand() % 26 + 65 + rand() % 2 * 32 auseinander:

  • rand() % 26 + 65 erzeugt eine Zufallsgroßbuchstaben;
  • rand() % 2 * 32 generiert entweder 0 oder 32 und konvertiert damit den Großbuchstaben in die Hälfte der Zeit in sein Kleinbuchstaben-Gegenstück.

Eine andere, ausführlichere Art und Weise, diesen Ausdruck neu zu schreiben wäre:

letter = rand() % 26 + 65; 
if (rand() % 2) { 
    letter += 32; 
} 
+0

Ich würde gerne fragen, wie '' rand()% 2 * 32 'entweder '0' oder '32' erzeugt. Zum Beispiel verstehe ich den Grund hinter 'rand()% 26 + 65 ', weil der ASCII-Wert' 65 'als" Startpunkt "betrachtet wird, während' rand()% 26 'einfach nur ein zufälliges ASCII-Zeichen aus' generiert Ab 65 + 26' aber wie funktioniert '*' in 'rand()'? –

+2

@TeoChuenWeiBryan Lesen Sie mehr über den Modulo-Operator '%'. –

+0

@TeoChuenWeiBryan: 'rand()% 2' erzeugt entweder' 0' oder '1'. Wenn Sie sie mit "32" multiplizieren, erhalten Sie entweder "0" oder "32". – NPE

2

Eine alternative Lösung für das Problem, von zufälligen Groß- oder Kleinbuchstaben Zeichen zu erzeugen, könnte sein, beispielsweise zu verwenden, std::string, um das Groß- und Kleinbuchstabe in dem systemeigenen Codierungsschema zu speichern. Dann verwende z.B. std::uniform_int_distribution von der C++ 11 pseudo-random generator library.

So etwas wie dies

// All letters (exchange the dots for the actual letters) 
static std::string const letters = "ABC...XYZabc...xyz"; 

// Initialize the random-number generation 
std::random_device rd; 
std::mt19937 gen(rd()); 

// This distribution will generate a value that will work as 
// an index into the `letters` string 
std::uniform_int_distribution<> dis(0, letters.size() - 1); 

// Generate one random character 
char random_character = letters[dis(gen)]; 

Siehe here es zu sehen "in Aktion".

+0

Diese Antwort ist großartig, weil sie nicht das Alphabet annimmt, auf das Menschen normalerweise fixieren. Es gibt andere Buchstaben auf der Welt, sogar in englischem Text. –

1
const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 

char ch = chars[rand() % 52]; 

Dies funktioniert für alle Zeichenkodierungen, nicht nur ASCII.

0

einfach nur rand auf die gesamte mögliche Anzahl der Zeichen verwenden:

int value = rand() % ('Z' - 'A' + 'z' - 'a'); 
unsigned char letter = 'A' + value; 
if (letter > 'Z') 
{ 
    letter = 'a' + value - ('Z' - 'A'); 
} 
Verwandte Themen