生成由字母和数字组成的随机单词

Generating random word made of letters and digits

本文关键字:单词 数字 随机      更新时间:2023-10-16

我正在寻求有关我的代码的帮助。我正在做应用程序,这将从 Imgur.com 下载随机图像,并且我坚持使用他们的名字生成器。

这是我有的代码

char letter;
unsigned short int asciiCode = 0;
std::string imageName = "";
std::ofstream fileToStoreImageNames;

if (!fileToStoreImageNames.is_open())
    return -1;

for (auto i = 0; i < 6; i++)
{ 
    /* if getTrueOrFalse()==0 return capitalLetter() if not return smallLetter() */
    asciiCode = random.getTrueOrFalse() == 0 ? random.upperCase() : random.lowerCase();
    letter = static_cast <char>(asciiCode);
    if (imageName.size() > 0)
        imageName += letter;
    else
        imageName = letter;
}
fileToStoreImageNames << imageName << std::endl;

我做了一些生成器,它们从定义的范围内返回数字(在 random.upperCase() 的情况下,它的范围为 65 到 90),大写有 50% 的机会,小写有 50% 的机会。后来我通过static_cast将这些数字转换为字符。 目前,我只将这些名称写入文件,我可以看到它没有按预期工作。如果我只是编译这段代码,它正在写入类似

bbbbbb rrrrrr YYYYYY vvvvvv UUUUUU EEEEEE rrrrrr但是,当我逐步调试它时,它正在正常工作,并且我收到随机字母。有我的文件经过 11 次尝试,第 8 行和第 11 行,是逐步调试的结果。

你的程序似乎太快了。如果您调试代码,则时间会过去,并且随机数生成器 (RNG) 会从操作系统获得不同的时间点。 RNG 使用当前时间来提供伪随机数。

您可以使用 c++11 标准伪随机数生成的 RNG。RNG 对象实例化一次,并将在循环的每个周期中提供不同的随机数。

与其在每次调用 random 函数时都播种 RNG,不如在该类的构造函数中执行一次,然后在整个类成员函数中存储和重用生成器。出现您的问题是因为如果它们使用相同的时间戳播种,它们会产生相同的结果,因此您会在同一秒内多次调用该函数的相同字符。使用 C++11 随机库时,您甚至不应该使用时间戳作为种子。