0

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

3 回答 3

2

考虑到您想随机访问向量元素,这可能是因为您在循环内设置了种子。

尝试在开始时只播种一个并rand() % BunnyNames.size()在循环内使用:

srand (time(0));
while(condition)
{
    int randomIndex = rand() % BunnyNames.size();
}

另一种情况可能是循环迭代得足够快,以至于在连续迭代中,时间不会改变,从而产生相同的值。

于 2013-09-14T15:33:02.000 回答
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;

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

于 2013-09-14T15:47:37.953 回答
1

谢谢大家的帮助。事实证明,它实际上是在打印随机名称,但我没有听懂,因为名称似乎仍然按字母顺序排列。我没有意识到它一次跳过了一组名称,这取决于我重新运行程序之前的时间(因为 srand (time(0)) 是基于时间的)。

于 2013-09-14T15:45:47.083 回答