C++ c+中数字向量的线性搜索+;
我试图输出9个随机的不重复的数字。这就是我一直想做的:C++ c+中数字向量的线性搜索+;,c++,search,random,C++,Search,Random,我试图输出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++) {
#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];
}
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
srand(时间(0));
向量v;
对于(inti=0;i当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;
}
#包括
#包括
#包括
int main(){
int n=4;
std::向量值(n);
std::设置使用的_值;
对于(int i=0;i
因此,rand()
近似于真正的生成器,它将返回相同的数字;甚至可能是连续的:您使用%10
进一步加剧了这一问题
如果不希望重复,则实例化一个包含所有可能需要的数字的向量,然后将其洗牌。std::shuffle
可以帮助您完成此操作
请参见挑剔:随机数很可能会重复-事实上,如果您防止重复数字,它们就不再是随机数。这可能不会解决OP的特定问题(它们的代码有什么问题),因此在这种情况下它并没有真正的帮助。我认为应该将它发布到重复的目标上。@user202729:你为什么这么说?你有关于使用要求的更多信息吗?@user202729:在你看来。在我看来,指出算法有缺陷以及原因就足够了。指出具体要求因此,实施中的fic缺陷没有任何好处。不过,您的回答没有坏处。至于性能,瓶颈将出现在cout
,而不是Fisher Yates(10个数字)。如果您的答案仅包含这些,请投票以重复的方式关闭(IMO)更好。虽然…这稍微好一点,因为它解释了为什么rand()
生成重复的数字。不确定是否值得。@user202729:但一定要回答-还有时间。如果我喜欢,我会投票。投票永远不会是个人问题。你对如何解决这个问题有什么建议吗?是的。假设你已经在n
大小的数组中填充了k
不同的值。还有,这些k
数字将必须出现在集合中。现在要放置k+1
第个索引,请生成一个随机数字,并检查它是否出现在集合中。如果不存在,则将其分配到该位置,否则重复。我不清楚您想做什么do@matt请看更新后的答案。我已经向cl提供了代码请验证我在评论中解释的内容。每次运行程序时,更新的答案都会给我相同的随机唯一数,而不是每次运行程序时都给我不同的随机唯一数