我试图同时生成一个包含大写和小写字母的数组。
我理解生成两个单独的字母背后的逻辑。
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()
背后的逻辑高低。
任何帮助将不胜感激。
答案 0 :(得分:7)
观察32
是65
和97
之间的差异,即大写和小写字母的ASCII代码之间的差异。
现在让我们分开rand() % 26 + 65 + rand() % 2 * 32
:
rand() % 26 + 65
生成随机大写字母; rand() % 2 * 32
生成0
或32
,从而将大写字母转换为小写字母的一半。重写此表达式的另一种更详细的方法是:
letter = rand() % 26 + 65;
if (rand() % 2) {
letter += 32;
}
答案 1 :(得分:2)
您的问题的替代解决方案,即生成随机的大写或小写字符,可能是使用例如std::string
以系统上使用的任何本机编码方案保存大写和小写字符。然后用例如来自C ++ 11 std::uniform_int_distribution
的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以查看“在行动中”。
答案 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');
}