随机每次都返回相同的输出

Random is returning the same output every time

本文关键字:输出 返回 随机      更新时间:2023-10-16

我写了这段代码,它工作正常,但每次输出都是一样的。所以它不是随机的。想知道为什么!假设: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;
   }
}

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

尝试将其添加到main()的第一行

srand(unsigned(time(NULL)));

您使用的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';
}