我在寻找代码方面的帮助。我正在做应用程序,它将从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),upperCase有50%的可能性,lowerCase有50%的机会。稍后我将这些数字通过static_cast转换为char。 现在我只将这些名字写入文件,我可以看到它没有按预期工作。如果我只是编译这段代码,它正在写入类似
的文件 bbbbbb
rrrrrr
YYYYYY
vvvvvv
UUUUUU
EEEEEE
rrrrrr
但是,当我逐步调试它时,它应该是正常工作,我得到随机字母。 11次尝试后,There是我的文件,第8行和第11行是逐步调试的结果。
答案 0 :(得分:1)
你的程序似乎太快了。如果您调试代码时间过程,并且随机数生成器(RNG)从您的操作系统获得不同的时间点。 RNG使用当前时间来传递伪随机数。
您可以使用c++11 standard pseudo random number generation中的RNG。 RNG对象实例化一次,并在循环的每个循环中提供不同的随机数。
答案 1 :(得分:1)
不是在每次调用random
函数时播种RNG,而是在该类的构造函数中执行一次,然后在类成员函数中存储和重用生成器。出现问题是因为如果它们以相同的时间戳播种,则会生成相同的结果,因此您可以在同一秒内多次调用该函数。使用C ++ 11随机库时,您甚至不应该使用时间戳作为种子。