随机每次都返回相同的输出
Random is returning the same output every time
我写了这段代码,它工作正常,但每次输出都是一样的。所以它不是随机的。想知道为什么!假设: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';
}
相关文章:
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- C++输出参数与返回值
- cpp 返回具有相同输入的不同输出
- 显示C++输出而不返回值
- 简单函数并不总是返回预期的输出
- 输出返回编号。等于输入字符串的单词的字符串数
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 为什么 boost::locale::to_title 不返回预期的输出?
- 在函数中连接两个字符,并在 C++ 中返回输出
- 同一个程序每次返回不同的输出
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- cout.width和cout.fill返回不同的输出
- C 输出返回值
- 面向对象C++帮助?出于某种原因,对象变量的输出返回数值数组位置而不是实际值
- 调用一个方法会将输出返回到同一类c++的另一个方法中
- 二进制文件中结构的输出返回垃圾
- KissFFT输出返回一个值
- 为什么FFTW输入非零,输出返回全零(c++)