我有这样的函数,可以像我这样随机索引:
size_t randomIndex(vector<int>myVector) {
srand(time(NULL));
size_t index1 = rand() % myVector.size();
return index1;
}
我称之为另一种功能:
void generaTwoIndex(vector<int> myVector2) {
size_t index1 = randomIndex(myVector2);
cout << "index1 = " << index1 << endl;
size_t index2 = randomIndex(myVector2);
cout << "index2 = " << index2 << endl;
}
它为我生成了相同的索引。有什么问题? 提前感谢你的答案。
答案 0 :(得分:7)
time(NULL)
返回自1970年以来的秒数。由于您每次调用该函数两次,调用之间的时间不到一秒,因此time(NULL)
为两个调用返回相同的值,并且对于两个呼叫,RNG的播种具有相同的值。
生成随机数时,生成器会自动生成其结果。所以你只需要播种一次:
size_t randomIndex(vector<int>myVector) {
size_t index1 = rand() % myVector.size();
return index1;
}
void generaTwoIndex(vector<int> myVector2) {
srand(time(NULL)); //I would recommend moving this line to main()
size_t index1 = randomIndex(myVector2);
cout << "index1 = " << index1 << endl;
size_t index2 = randomIndex(myVector2);
cout << "index2 = " << index2 << endl;
}
答案 1 :(得分:1)
srand()
是为了使rand()
具有确定性,因此可能发生的事情是,因为对srand()
的两次调用几乎在同一时间被调用,因此它们获得time(null)
的相同值{1}},用于确定rand()
的未来值。要解决此问题,请将第二个块更改为:
void generaTwoIndex(vector<int> myVector2) {
srand(time(NULL));
size_t index1 = randomIndex(myVector2);
cout << "index1 = " << index1 << endl;
size_t index2 = randomIndex(myVector2);
cout << "index2 = " << index2 << endl;
}
并从第一个区块中移除srand(time(NULL));
。