所以我正在制作一个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);
}
}
}
答案 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;
}