在另一个函数内调用随机函数

时间:2016-05-23 22:53:26

标签: c++ function random

我有这样的函数,可以像我这样随机索引:

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;
}

它为我生成了相同的索引。有什么问题? 提前感谢你的答案。

2 个答案:

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