2016-08-18 9 views
1

大文字と小文字の両方の配列を同時に生成しようとしています。ランダムな大文字と小文字の生成の背後にあるロジック

私は文字の2つの別々のケースを生成する背後にある論理を理解しています。

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

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

ながら、私は一緒にそれらの両方を生成する方法をグーグルでみました、ここで私が得たものです。

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

残念ながら、彼らは正確にその背後にあるロジックを説明していなかったと私はちょうど盲目的にコピーしたいと私の割り当てに貼り付けないでください。最初のrand()rand()を追加するときは、rand() % 2 * 32の背後にあるロジックの高低を検索していました。

ご協力いただければ幸いです。

+1

これは、ASCIIエンコードだけの退屈な内容です。それが意味をなさないようになるまで、あなたはそれをしばらく注視することができます。 –

+2

まず、魔法の数字を避けるべきです。たとえば、最初のスニペットは 'rand()%( 'Z' - 'A' + 1)+ 'A' 'と書く方が良いでしょう。 –

+0

まず、[* magic numbers *](https://en.wikipedia.org/wiki/Magic_number_(プログラミング))は避けてください。あなたが文字Aを意味するなら、そう言いなさい( '' A ''のように)。第2に、[ASCIIテーブル](http://en.cppreference.com/w/cpp/language/ascii)を読むことが役に立ちます。文字の生成方法(上位、下位、または混在)は、[ASCII](https://en.wikipedia.org/wiki/ASCII)を使用するシステムでのみ機能することにも注意してください。他のエンコーディングはまれですが、まだ存在します。 –

答えて

7

326597の違い、つまり大文字と小文字のASCIIコードの違いであることに注意してください。

今度は離れてrand() % 26 + 65 + rand() % 2 * 32てみましょう:

  • rand() % 26 + 65は、ランダムな大文字を生成します。
  • rand() % 2 * 32は、0または32のいずれかを生成します。これにより、大文字をその半分の小文字の半分に変換します。

異なる、より詳細な方法で、この式を書き換えるためには次のようになります。

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

'rand()%2 * 32'は' 0'か '32'のどちらを生成するのですか?例えば、私は 'rand()%26 + 65'の背後にある理由を理解しています。なぜなら' rand()%26'は ' 65 + 26'以降で動作しますが、 'rand()'の '*'はどのように動作しますか? –

+2

@TeoChuenWeiBryanモジュロ演算子 '%'についてもっと読む。 –

+0

@TeoChuenWeiBryan: 'rand()%2'は' 0'または '1'のいずれかを生成します。それらを '32 'で掛けると、' 0'か '32'のいずれかが得られます。 – NPE

2

ランダム大文字または小文字の文字を生成する問題への代替解決策は、例えばを使用するかもしれませんstd::stringは、システムで使用されているネイティブエンコーディングスキームの大文字と小文字を保持します。次に、 std::uniform_int_distribution(C++から)pseudo-random generator library。この

// 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)]; 

よう

何か "アクションに" それを見るためにhereを参照してください。

+0

この答えは人々が通常固定しているアルファベットを仮定していないのですばらしいです。世界には、英語のテキストでさえ、他の文字があります。 –

1
const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 

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

これは、ASCIIだけでなくすべての文字エンコードで使用できます。

0

単純に文字の全体の可能なカウントにランドを使用します。

int value = rand() % ('Z' - 'A' + 'z' - 'a'); 
unsigned char letter = 'A' + value; 
if (letter > 'Z') 
{ 
    letter = 'a' + value - ('Z' - 'A'); 
} 
関連する問題