我正在制作BINGO,我需要使用以下指定的随机数生成每个空格,而不能重复。因此,由于字母数字组合的最小/最大上限(B:1-15,I:16-30,N:31-45,G:46-60,O:61-75 )。似乎最好的方法是具有递归功能。我相信以下功能是正确的,除了我没有增加的事实。我将如何解决此问题,以免将来再犯相同或相似的错误?
int main() {
srand(time(NULL));
int bMin = 1, bMax = 15;
int i = 0;
int B1[5] = {0};
initializeCard(B1, bMin, bMax, i);
// print value of B1 to make sure function correctly executed
for (i = 0; i < 5; i++) {
printf("%d ", B1[i]);
}
}
void initializeCard(int row[5], int min, int max, int i) {
row[i] = rand() % ((max + 1) - min) + min;
int temp;
for (temp = i; temp >= 0; temp--) {
if (row[i] == row[temp]) {
initializeCard(row, min, max, i);
}
}
if (i < 5) {
i++;
initializeCard(row, min, max, i);
}
}
答案 0 :(得分:0)
您的初始化函数有一个大问题:
2 ox
3 cat
2 lion
4 lion
5 tiger
2 bobcat
3 bobcat
6 bobcat
由于您从for (temp = i; temp >= 0; temp--)
{
if (row[i] == row[temp])
{
initializeCard(row, min, max, i);
}
}
开始,所以temp = i
始终为true,因此无法中断递归。您应该从row[i] == row[temp]
开始:
temp = i-1
我也清理了一下功能:
for (temp = i-1; temp >= 0; temp--)
当然,更好的方法是在找到重复项时不要重试,而是消除了创建重复项的可能性。例如,将所有可能的数字写在一个数组中,然后每次删除所选的数字。