gpt4 book ai didi

c - 在C中递归生成不重复的随机数

转载 作者:行者123 更新时间:2023-11-30 16:25:22 25 4
gpt4 key购买 nike

我正在制作 BINGO,我需要使用下面指定的随机数生成每个空间,并且不能重复。因此,由于字母数字组合的最小/最大上限(B:1-15,I:16-30,N:31-45,G:46-60,O:61-75),我一次要进行每一行)。看来最好的方法是使用递归函数。我相信除了 i 没有增加之外,以下函数是正确的。我该如何解决这个问题,这样我将来就不会犯同样或类似的错误?

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);
}
}

最佳答案

你的初始化函数有一个大问题:

for (temp = i; temp >= 0; temp--)
{
if (row[i] == row[temp])
{
initializeCard(row, min, max, i);
}
}

由于从 temp = i 开始,row[i] == row[temp] 始终为 true,因此无法中断递归。您应该从 temp = i-1 开始:

for (temp = i-1; temp >= 0; temp--)

我还稍微清理了这个函数:

void initializeCard(int row[5], int min, int max, int i)
{
row[i] = rand() % ((max + 1) - min) + min;

int temp;
for (temp = i-1; temp >= 0; temp--) //Do not check i itself
{
if (row[i] == row[temp])
{
initializeCard(row, min, max, i);
return; //No need to continue this function
}
}

i++; //Increment before checking, otherwise it is executed with i=5 which is out of bounds
if (i < 5)
{
initializeCard(row, min, max, i);
}
}

当然,更好的方法是如果发现重复项,则不再尝试,而是消除创建重复项的可能性。例如,将所有可能的数字写入一个数组,然后每次删除所选的数字。

关于c - 在C中递归生成不重复的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53424667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com