Random每次都返回相同的输出

时间:2012-06-21 15:00:41

标签: c++ random vector

我编写的代码工作正常但每次输出都相同。所以没有随意的。很想知道为什么! 假设:33名学生 第一排:7名学生 第二排:9名学生 第3排:9名学生 第4排:8名学生

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

int main() {
   vector<int> random;

   for (int i = 1; i < 34; i++)
      random.push_back(i);

   random_shuffle(random.begin(), random.end());

   for (int i = 1; i < 8; i++)
      cout << random[i] << " " ;
   cout << endl;

   int i = 7;
   int num_seats = 1;

   for (int j = 1; j <=3; j++) {
      while (num_seats < 10 && i < 33) {
         cout << random[i++] << " " ;
         num_seats++;
      }
      cout << endl;
      num_seats = 1;
   }
}

2 个答案:

答案 0 :(得分:7)

您需要先初始化随机数生成器。随机数生成取决于“种子值”。要在每次执行程序时获得唯一的种子值,您可以依赖当前时间。 time(NULL)返回表示当前时间的秒数 - 可以是该唯一种子。

尝试在main()

中的第一行添加此内容
srand(unsigned(time(NULL)));

答案 1 :(得分:2)

您使用的random_shuffle()重载会访问未指定的随机源。它几乎肯定会使用rand(),这意味着你需要使用srand()来播种它以获得不同的随机随机播放。

然而,更便携的解决方案是指定随机源,因此您不必假设使用rand()。如果您的实现是C ++ 11,那么最好的选择是使用shuffle()<random>库中的引擎:

#include <random>
#include <algorithm>

#include <vector>
#include <numeric>
#include <iterator>
#include <iostream>

int main() {
    std::vector<int> v(34);
    iota(begin(v), end(v), 1);

    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937_64 eng(seed);

    shuffle(begin(v), end(v), eng);

    copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

缺少C ++ 11,您可以使用带有随机数生成器的random_shuffle()重载,以便程序可移植地指定随机源:

#include <cstdlib>
#include <ctime>
#include <algorithm>

#include <vector>
#include <iterator>
#include <iostream>

struct RNG {
    int operator() (int n) {
        return static_cast<int>(std::rand()/(static_cast<double>(RAND_MAX)+1) * n);
    }
};

int main() {
    std::vector<int> v(34);
    for (int i=0; i < v.size(); ++i)
        v[i] = i + 1;

    std::srand(std::time(NULL));
    random_shuffle(v.begin(), v.end(), RNG());

    copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}