如何从填充.txt文件名C ++的向量中选择一个随机元素

时间:2013-09-14 15:18:52

标签: c++ text random vector generated

我将.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

3 个答案:

答案 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;

它将生成的数字从上次运行的程序保存到文件中,然后在下次运行时将该值用于种子。