我正在尝试输出9个随机非重复数字。这就是我一直在努力做的事情:
#include <iostream>
#include <cmath>
#include <vector>
#include <ctime>
using namespace std;
int main() {
srand(time(0));
vector<int> v;
for (int i = 0; i<4; i++) {
v.push_back(rand() % 10);
}
for (int j = 0; j<4; j++) {
for (int m = j+1; m<4; m++) {
while (v[j] == v[m]) {
v[m] = rand() % 10;
}
}
cout << v[j];
}
}
然而,我经常会重复数字。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:2)
使用 true 随机数生成器,绘制特定数字的概率不是以先前绘制的任何数字为条件的。例如,我确定你在掷骰子时两次获得相同的数字。
rand()
,它大致接近一个真正的发电机,因此会给你相同的数字;甚至连续地:你使用% 10
进一步加剧了这一点。
如果你不想要重复,那么实例化一个包含你想要的所有数字的向量,然后 shuffle 它们。 std::shuffle
可以帮助您实现这一目标。
请参阅http://en.cppreference.com/w/cpp/algorithm/random_shuffle
答案 1 :(得分:1)
j=0
时,您将使用m={1, 2, 3}
进行检查
但是当j=1
时,您只需m={2, 3}
进行检查。
您没有再次使用0th
索引进行检查。在那里,你可能会重复。
另外,请注意减少重复数字的可能性,为什么不增加随机值的大小,让我们说100
。
请通过不断检查std::set
中使用的值来查看以下代码以获取不同的随机值:
#include <iostream>
#include <vector>
#include <set>
int main() {
int n = 4;
std::vector <int> values(n);
std::set <int> used_values;
for (int i = 0; i < n; i++) {
int temp = rand() % 10;
while (used_values.find(temp) != used_values.end())
temp = rand() % 10;
values[i] = temp;
}
for(int i = 0; i < n; i++)
std::cout << values[i] << std::endl;
return 0;
}