为什么我的数组中会出现重复项?

时间:2017-09-26 23:23:07

标签: c

所以我正在制作一个52个整数的数组,我添加了随机数字并确保它们有所不同。如果有重复,我会生成一个新数字,以便当前的索引不同。我哪里错了?

for(i=0; i < SIZE; i++){

    deck[i] = (rand() % 52);

    for(c= 0; c <= i; c++ ){
            if(deck[c] == deck[i+1]){

            deck[i] = (rand() % 52);
        }

    }
}

2 个答案:

答案 0 :(得分:3)

你不能只为内部for循环中的随机数尝试一次。生成后,您必须再次检查所有先前生成的项目,以确保您没有生成与另一项目相同的随机数。这样就可以了(假设SIZE = 52):

for(i=0; i < SIZE; i++){
    deck[i] = (rand() % SIZE);
    for(c= 0; c < i; c++ ){
        if(deck[c] == deck[i]){
            // Try another number
            i--;
            break;
        }
    }
}

那就是说,这不是一个非常快速的解决方案(它可能永远不会结束)。最好创建一个数字0到51的数组,然后通过一次交换两个元素来重新排列它们。我不打算为你写这个,但这是一种标准的做法。

答案 1 :(得分:2)

完全错误的做法。你不想要随机数;你想要的是数字0到51,按随机顺序排列。为此,请使用值0..51填充数组,然后正确 shuffle

for (int i = 0; i < 52; i += 1) deck[i] = i;
for (int i = 52; i > 1; i -= 1) {
    int j = rand() % i;
    int temp = deck[j];
    deck[j] = deck[i-1];
    deck[i-1] = temp;
}