我编写的代码工作正常但每次输出都相同。所以没有随意的。很想知道为什么! 假设: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;
}
}
答案 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';
}