2

我写了这段代码,它工作正常,但每次输出都是一样的。所以没有什么随机的。很想知道为什么!假设:33 名学生第一排:7 名学生第二排:9 名学生第三排:9 名学生第四排: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;
   }
}
4

2 回答 2

8

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

尝试在里面的第一行添加这个main()

srand(unsigned(time(NULL)));
于 2012-06-21T15:04:50.573 回答
2

您使用的random_shuffle()重载访问未指定的随机源。它几乎肯定是 using 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';
}
于 2012-06-21T15:37:44.070 回答