在C中以非递归方式生成随机数

时间:2018-11-22 05:54:44

标签: c

我正在制作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);
    }
}

1 个答案:

答案 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--)

当然,更好的方法是在找到重复项时不要重试,而是消除了创建重复项的可能性。例如,将所有可能的数字写在一个数组中,然后每次删除所选的数字。