string bolsa_letras::letters_generator(int quantity){
int already_generated = 0;
map<char, int> aux = values;
string out;
while(already_generated != quantity){
char generated_char = 'A' + rand()%26;
if(aux[generated_char] > 0){
out.push_back(generated_char);
aux[generated_char]--;
already_generated++;
}
}
return out;
}
上面是给定数字生成随机字母的代码。
地图会保存字母和出现字母的时间。问题是,每次我运行代码时,它都会打印出相同的内容:NLRBBMQH。为什么会这样?
我为rand函数添加了cstdlib。
答案 0 :(得分:6)
确定性程序不能自然地产生随机性。我们需要从其他地方获得这种随机性。在rand()
的过去,通常seed RNG和std::time(NULL)
的结果在每次运行时都会产生不同的状态。
如今,我们使用<random>
提供的“更随机”的工具。
在cppreference.com's documentation on std::uniform_int_distribution
中,您可以找到类型为int
的整数的示例。现在,char
也是整数类型。让我们稍微调整一下他们的示例:
#include <random>
#include <iostream>
int main()
{
std::random_device rd; // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<char> dis('A', 'Z');
for (int n=0; n<10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << '\n';
}
还有tadaaaa!一个随机字母生成器:)