所以我想做的是创建一个由 5 个元素组成的随机数组,这些元素应该用 1 到 6 的数字填充,并且它们不会重复,我不知道我的逻辑错在哪里。
void genNumber(int vet[]){
int max, i, j, atual;
srand(time(NULL));
max = 7;
for (i=0;i<5;i++){
vet[i] = rand() % max;
while(vet[i] == 0){
vet[i] = rand() % max;
}
for(j=0;j<i;j++){
atual = vet[j];
while((vet[i] == atual)||(vet[i] == 0)){
vet[i] = rand() % max;
atual = vet[j];
}
}
}
}
更新:已修复
void genNumber(int vet[]){
int max, i, j;
srand(time(NULL));
max = 7;
for (i=0;i<5;i++){
vet[i] = rand() % (max-1) + 1;
for(j=0;j<i;j++){
while(vet[j] == vet[i]){
vet[i] = rand() % (max-1) + 1;
j = 0;
}
}
}
}
最佳答案
逻辑缺陷在于发现重复项时生成新随机数的方式。
假设您已经有了 vel = {1,2,0,0,0,...}
并且正在尝试查找 vel[2]
的数字。如果您随机绘制一个2
,您会发现它已经在那里并再次绘制。但是,如果您这次绘制 1
,您将不会注意到,因为您仅与最后看到的值(示例中的 2
)进行比较。所以你会得到vel = {1,2,1,...}
。
“解决方案”:每次您抽取一个新的随机数时,都必须将其与列表中已有的所有数字进行比较。
解决此问题的另一种方法是我在评论中尝试概述的方法:您必须在某处保留有关哪些号码对于抽奖仍然有效的信息。您可以像现在一样使用“输出”数组,也可以使用另一个存储,在绘制条目后从中“删除”条目。
关于c - 没有重复数字的随机数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284644/