繁体   English   中英

C中没有重复项的随机数数组

[英]Random number array without duplicates in C

我正在尝试使用以下方法创建无重复的随机整数数组生成器:

int pt_rand(int nbits) {
    int mask;
    if (0 < nbits && nbits < sizeof(int)*8) {
        mask = ~(~((unsigned int) 0) << nbits); 
    }
    else {
        mask = ~((unsigned int) 0);
    }
    return rand() & mask;
}

int *gen_rand_int_array_nodups(int length, int nbits) {
    int * a = malloc(sizeof(int)*length);
    for (int i = 0; i < length; i++) {
        a[i] = pt_rand(nbits);
        for (int j = 0; j < i; j++) {
            do {
                a[i] = pt_rand(nbits);
            } while (a[i] == a[j]);
        }
    }
    shuffle_int_array(a, length);
    return a;
}

该代码试图通过一一检查元素来在给定的nbit内生成唯一的随机整数。 但是,我仍然在结果中得到重复,并且我还没有弄清楚为什么。 我知道使用这种方法生成唯一的随机数是一种不好的做法,但是我的作业要求要求我以某种方式使用nbits参数。 我一直在寻找一种最简单的方法来实现相同的事情,方法是使用递增数字填充数组并交换它们,但这只是一个替代解决方案,我仍然必须确认是否允许使用它。

    for (int j = 0; j < i; j++) {
        do {
            a[i] = pt_rand(nbits);
        } while (a[i] == a[j]);
    }

i=3j=1a={5,2,3,2} 现在,您检测到您已经拥有了2 ...,所以说pt_rand()现在给您5 您如何检测您已经有5

更正的版本:

int *gen_rand_int_array_nodups(int length, int nbits) {
    int * a = malloc(sizeof(int)*length);
    for (int i = 0; i < length; i++) {
        int duplicate;
        do
        {
            duplicate = 0;
            a[i] = pt_rand(nbits);
            for (int j = 0; j < i; j++) {
                if (a[j] == a[i])
                {
                    duplicate = 1;
                    break;
                }
            }
        } while (duplicate);
    }
    shuffle_int_array(a, length);
    return a;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM