生成随机大写和小写字母的逻辑

时间:2016-08-18 13:56:59

标签: c++ random

我试图同时生成一个包含大写和小写字母的数组。

我理解生成两个单独的字母背后的逻辑。

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() % 2 * 32添加到第一个rand()时,一直在搜索rand()背后的逻辑高低。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:7)

观察326597之间的差异,即大写和小写字母的ASCII代码之间的差异。

现在让我们分开rand() % 26 + 65 + rand() % 2 * 32

  • rand() % 26 + 65生成随机大写字母;
  • rand() % 2 * 32生成032,从而将大写字母转换为小写字母的一半。

重写此表达式的另一种更详细的方法是:

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

答案 1 :(得分:2)

您的问题的替代解决方案,即生成随机的大写或小写字符,可能是使用例如std::string以系统上使用的任何本机编码方案保存大写和小写字符。然后用例如来自C ++ 11 std::uniform_int_distributionpseudo-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以查看“在行动中”。

答案 2 :(得分:1)

const char chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

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

这适用于所有字符编码,而不仅仅是ASCII。

答案 3 :(得分:0)

只需在整个可能的字符数上使用rand:

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