【问题标题】:Calling random function inside another function [duplicate]在另一个函数中调用随机函数[重复]
【发布时间】:2016-09-20 23:20:18
【问题描述】:

我有这样的随机索引功能:

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

它为我生成了相同的索引。问题是什么? 提前感谢您的回答。

【问题讨论】:

  • 有什么问题?您太快调用srand(time(NULL));,这很可能导致相同的种子(因为秒数不会改变 - 尽管即使这样做也是错误的)。我的建议是在您的 main() 中播种 1 次。
  • 不!它不会在循环中调用它。在第二个函数中,我想使用第一个函数随机生成两个不同的索引。
  • 不!它不会在循环中调用它。但原因相同。
  • 不一样的想法。就我而言,我不使用循环 stackoverflow.com/users/1413395/…
  • 不一样的想法。是的。将您的案例想象成展开一个大小为 2 的循环。话虽如此,请阅读下面的答案。他们都解释了原因。

标签: c++ function random


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    srand() 是为了使rand() 具有确定性而创建的,所以可能发生的情况是,因为对srand() 的两次调用几乎同时被调用,所以它们得到time(null) 的相同值,这决定了未来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));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多