如何在 C++ 中编写随机大写字符生成器?

Use*_*645 3 c++ random int type-conversion char

我对此的看法是

#include <iostream>

int main()
{
    for( int i = 0; i < 20; ++i) {
        std::cout << (char) ((random() % (int('Z') + 1)) + int('A'))  << '\n';
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎非常直接。您生成一个数字,它介于所有小于或等于Z和大于或等于 之间A。如果你玩它,你会发现还生成了其他字符。这是为什么?

Jar*_*d42 8

使用<random>,而不是假设 ASCII,你可能会这样做:

const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
constexpr std::size_t output_size = 20;
std::mt19937 rng{std::random_device{}()};
std::uniform_int_distribution<> dis(0, alphabet.size() - 1);
std::string res;
res.reserve(output_size);

std::generate_n(std::back_inserter(res),
                output_size,
                [&](){ return alphabet[dis()]; });
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 5

char c = *("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + rand() % 26);
Run Code Online (Sandbox Code Playgroud)

至少是便携的。请注意在常量上使用指针算术,该const char[27]常量衰减const char*表达式中的类型。转出rand()的东西出来std::random,如果上面没有足够的随机性。

  • 可能是“alphabet[rand() % 26];”。 (2认同)