我将.txt文件中的一长串名称存储到一个名为BunnyNames的向量中,我试图找到一种从所述向量中随机生成元素(名称)的方法。到目前为止,它所做的只是从.txt文件中连续打印名称而不是随意打印。这是我的代码:
int main()
{
using namespace std;
string name;
vector<string> BunnyNames;
ifstream myfile("names.txt");
if(!myfile)
{
cerr <<"Error opening output file"<< endl;
system("pause");
return -1;
}
while (getline(myfile, name))
{
BunnyNames.push_back(name);
}
srand (time(0));
int randomIndex = rand() % BunnyNames.size();
std::cout<<BunnyNames[randomIndex]<<std::endl;
return 0;
}
我只想让它一次打印一个名字,但我希望这个名字是随机的。
以下是该文件的前几行:
Abracadabra
Ace
Akeeta
答案 0 :(得分:2)
考虑到您想要随机访问向量元素,这可能是因为您在循环内设置种子。
尝试在开头只播种一个并在循环中使用rand() % BunnyNames.size()
:
srand (time(0));
while(condition)
{
int randomIndex = rand() % BunnyNames.size();
}
另一种情况可能是循环迭代速度足够快,在连续迭代中,时间不会改变,从而产生相同的值。
答案 1 :(得分:1)
感谢大家的帮助。事实证明它实际上打印出随机名称,但我没有抓住它,因为这些名称似乎按字母顺序排列。我没有意识到它一次跳过一组名字,这取决于我重新运行程序之前的时间长度(因为srand(time(0))是基于时间的。)
答案 2 :(得分:1)
问题是,如果你连续重复运行程序,你会使用相同或非常相似的种子(因为时间不会有太大变化)。你需要设计一种方法,在每次运行程序时生成一个完全不同的种子,或者创建一个可以保存状态的随机数生成器。例如,您可以这样做:
unsigned int seed = time(0);
std::ifstream fin("rand.txt");
if (fin)
{
fin >> seed;
fin.close();
}
srand(seed);
seed = rand();
unsigned int randomIndex = seed % BunnyNames.size();
std::ofstream fout("rand.txt");
fout << seed;
它将生成的数字从上次运行的程序保存到文件中,然后在下次运行时将该值用于种子。