C 为什么我的阵列中会出现重复?

C 为什么我的阵列中会出现重复?,c,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); }

所以我制作了一个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);
        }

    }
}
for(i=0;i对于(c=0;c您不能在内部for循环中仅尝试一次随机数。生成它后,您必须再次检查以前生成的所有项,以确保您没有生成与另一项相同的随机数。这将完成以下操作(假设大小为52):

for(i=0;i

也就是说,这不是一个很快的解决方案(它可能永远不会结束)。最好创建一个0到51的数字数组,然后通过一次交换两个元素来洗牌。我不打算为您编写这篇文章,但这是一种标准的方法。

对于内部for循环中的随机数,您不能只尝试一次。生成后,您必须再次检查之前生成的所有项以确保您没有生成与另一个项目相同的随机数。这会起作用(假设大小=52):

for(i=0;i

也就是说,这不是一个很快的解决方案(它可能永远不会结束)。最好创建一个0到51的数字数组,然后通过一次交换两个元素来洗牌。我不打算为您编写,但这是一种标准的方法。

完全是错误的方法。您不需要随机数;您需要的正是0到51的数字,以随机顺序。为此,请在数组中填充值s 0..51,然后正确地将其洗牌:

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;
}
(inti=0;i<52;i+=1)甲板[i]=i; 对于(int i=52;i>1;i-=1){ int j=rand()%i; 内部温度=甲板[j]; 甲板[j]=甲板[i-1]; 甲板[i-1]=温度; }
完全是错误的方法。您不想要随机数;您想要的是以随机顺序排列的0到51的数字。为此,请使用值0..51填充数组,然后正确地洗牌:

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;
}
(inti=0;i<52;i+=1)甲板[i]=i; 对于(int i=52;i>1;i-=1){ int j=rand()%i; 内部温度=甲板[j]; 甲板[j]=甲板[i-1]; 甲板[i-1]=温度; }

因此,如果
deck[c]
匹配
deck[i+1]
,您决定重新随机化
deck[i]
?这能解决什么问题?你需要重新对你正在测试的人进行随机分组,然后你需要将
c
重置为
0
,并在你重新对一个人进行随机分组后从头开始。而且这不是一种有效的随机分组方法,你可能需要查找knuth随机分组。@ChrisBeck我应该在ge之后将c=0吗划分出内部循环并比较deck[c]==deck[i]?设置
deck[i]
,然后将其与
deck[i+1]匹配
尚未设置。为什么?循环一次可能无法确保您没有重复的卡。我同意Chris的观点,这是低效的。理论上,您的操作方式可能非常慢。对于最后一张您需要的卡,例如14张(这是唯一剩下的卡)因此,你必须一直调用
rnd
,直到你得到14,这可能不会发生很长时间。最好是对数组进行洗牌。因此,如果
deck[c]
匹配
deck[i+1]
,你决定重新随机化
deck[i]
?这能解决什么问题?你需要重新对你正在测试的人进行随机分组,然后你需要将
c
重置为
0
,并在你重新对一个人进行随机分组后从头开始。而且这不是一种有效的随机分组方法,你可能需要查找knuth随机分组。@ChrisBeck我应该在ge之后将c=0吗划分出内部循环并比较deck[c]==deck[i]?设置
deck[i]
,然后将其与
deck[i+1]匹配
尚未设置。为什么?循环一次可能无法确保您没有重复的卡。我同意Chris的观点,这是低效的。理论上,您的操作方式可能非常慢。对于最后一张您需要的卡,例如14张(这是唯一剩下的卡)因此,您必须不断调用
rnd
,直到得到14,这可能不会发生很长时间。最好是将数组从组[c]==组[I]中洗牌给出一个无限循环?那么我是否应该把C++=1,在if语句之外?不,它是把C中的项与刚才生成的随机数进行比较。如果是相同的,那么你想尝试另一个数字并重置循环变量。它必须是-1,因为当它循环时,第一个发生的事情是C++,所以下一次AROU。ndc将为零。实际上,将
i
减量1,然后
从内部循环中断开,可能会更清楚。这样就不必写那行
deck[i]=(rand()%SIZE)两次。
if
块将只包含
i--;break;
我尝试了你链接的代码,得到了重复的代码,如果你这样做了,我--你将如何到达第51个索引?我有点困惑。哦,你真的不想为c==i的情况而烦恼。这实际上是一个巨大的错误。我会修复它。deck[c]==deck[i]给出一个无限循环?那么我是否应该把C++=1,在if语句之外?不,它是把C中的项与刚才生成的随机数进行比较。如果是相同的,那么你想尝试另一个数字并重置循环变量。它必须是-1,因为当它循环时,第一个发生的事情是C++,所以下一次AROU。ndc将为零。实际上,将
i
减量1,然后