c - 如何避免在 C 中随机化重复数字

标签 c random numbers repeat

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/

相关文章:

c - 使用 FFT 代替卷积实现的低通滤波器

copy - 繁殖种群。我应该为每个人发送 `deepcopy` 吗?

c - 对我的一些函数的 undefined reference

linux - 在 Bash 中使用 $RANDOM 重复数字

java - 从 0-9 获得四个唯一随机数的最佳方法是什么?

c - 我如何在 C 中将一个数(例如 123)分成 1、2 和 3?

numbers - Lisp 函数从子集中添加奇数

java - 4 个进程的信号量执行

c - C的类ORM库

c - 如何在共享库中使用 popen()?