int i,j,vec[15]={0};
srand (time(NULL));
for (i=0;i<15;i++){
vec[i]=rand() % 25+1;
for (j=0;j<15;j++){
if (i!=j){
while(vec[i]==vec[j]){
vec[i]=rand() % 25+1;
}
}
}
printf("%d\n",vec[i]);
}
return 0;
}
代码仍然给我重复的数字
示例: 24 3 7 20 18 10 12 17 号 9 7 4 25 13 15 21
我不知道如何处理它
最佳答案
你的循环混淆了。逻辑是:生成一个随机数,直到找到列表中没有的数字。
这样做的方式是在检查循环内生成一个新数字。但这是行不通的。假设您正在生成第四个数字,发现它等于第三个数字。然后您生成一个新的,它很可能与您已经检查过的任何一个相同。
当 j > i
时,您还可以检查未初始化的元素。您的内部循环最多只能运行到 i
。
所以:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
int vec[15] = { 0 };
int i, j;
srand(time(NULL));
for (i = 0; i < 15; i++) {
int okay = 0;
while (!okay) {
vec[i] = rand() % 25 + 1;
okay = 1;
for (j = 0; j < i; j++) {
if (vec[i] == vec[j]) okay = 0;
}
}
printf("%d\n", vec[i]);
}
return 0;
}
使用 okay
变量看起来仍然有点尴尬。在我看来,检查重复项应该是一个单独的功能:
int contains(int arr[], int n, int x)
{
while (n--) {
if (arr[n] == x) return 1;
}
return 0;
}
int main()
{
// snip ...
for (i = 0; i < 15; i++) {
do {
vec[i] = rand() % 25 + 1;
} while (contains(vec, i, vec[i]));
printf("%d\n", vec[i]);
}
// snip ...
}
在您的情况下,可能的数字范围不会比数组元素的数量大。您还可以创建一个有序数组 {1, 2, 3, ..., 25}
,然后创建 shuffle it并仅使用前 15 个元素。
关于c - 如何避免在 C 中随机化重复数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26701872/