检查数组中是否已经给出了数字
check if the numbers already given in a array
这是我正在学习的一本书中的一个程序。我不明白这个程序是如何跟踪已经被占用的号码的。这本书很简洁,我不明白他们的解释。有人可以帮助我更好地理解这段代码的细节吗?具体代码注释中指出的部分。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int maxrange = 49;
const int maxballs = 6;
int rnd(int range);
void seedrnd(void);
int main()
{
int numbers[maxrange];
int i, b;
printf("L O T T O Z I E H U N G E N\n");
seedrnd();
for (i = 0; i < maxrange; i++)
{
numbers[i] = 0;
}
printf("Drueken sie eingabe fuer die Zahlen dieser Woche: ");
getchar();
printf("Es geht los\n");
//This is the part I am stuck at: where the numbers in the array
//are checked to see if the number has been used
for (i = 0; i < maxballs; i++);
{
do
{
b = rnd(maxrange);
} while (numbers[b - 1]);
numbers[b - 1] = 1;
printf("%i ", b);
}
printf("\n\nViel Glueck\n");
return 0;
}
int rnd(int range)
{
int r;
r = rand() % range + 1;
return (r);
}
void seedrnd(void)
{
srand((unsigned)time(NULL));
}
循环的目的是确保您获得 maxballs
个唯一数字。这是通过使用数组 numbers
来“记住”已经使用过的数字来完成的。
思路如下
首先数组numbers
用零填充。
然后选择一个随机数。例如 2. while (numbers[b - 1]);
停止,因为 numbers[1]
为零。
那么这里numbers[1]
设置为1numbers[b - 1] = 1;
然后选择下一个随机数。如果再次为 2,它将被拒绝,因为现在 numbers[1]
不为零,因此 while (numbers[b - 1]);
将导致选择另一个随机数。
通过这种方式,您将获得 maxballs
个唯一编号。
正如@ikegami 所评论的,值得一提的是,生成唯一数字随机序列的更好方法是 Fisher-Yates 随机播放。在这里阅读更多:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
这是我正在学习的一本书中的一个程序。我不明白这个程序是如何跟踪已经被占用的号码的。这本书很简洁,我不明白他们的解释。有人可以帮助我更好地理解这段代码的细节吗?具体代码注释中指出的部分。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int maxrange = 49;
const int maxballs = 6;
int rnd(int range);
void seedrnd(void);
int main()
{
int numbers[maxrange];
int i, b;
printf("L O T T O Z I E H U N G E N\n");
seedrnd();
for (i = 0; i < maxrange; i++)
{
numbers[i] = 0;
}
printf("Drueken sie eingabe fuer die Zahlen dieser Woche: ");
getchar();
printf("Es geht los\n");
//This is the part I am stuck at: where the numbers in the array
//are checked to see if the number has been used
for (i = 0; i < maxballs; i++);
{
do
{
b = rnd(maxrange);
} while (numbers[b - 1]);
numbers[b - 1] = 1;
printf("%i ", b);
}
printf("\n\nViel Glueck\n");
return 0;
}
int rnd(int range)
{
int r;
r = rand() % range + 1;
return (r);
}
void seedrnd(void)
{
srand((unsigned)time(NULL));
}
循环的目的是确保您获得 maxballs
个唯一数字。这是通过使用数组 numbers
来“记住”已经使用过的数字来完成的。
思路如下
首先数组numbers
用零填充。
然后选择一个随机数。例如 2. while (numbers[b - 1]);
停止,因为 numbers[1]
为零。
那么这里numbers[1]
设置为1numbers[b - 1] = 1;
然后选择下一个随机数。如果再次为 2,它将被拒绝,因为现在 numbers[1]
不为零,因此 while (numbers[b - 1]);
将导致选择另一个随机数。
通过这种方式,您将获得 maxballs
个唯一编号。
正如@ikegami 所评论的,值得一提的是,生成唯一数字随机序列的更好方法是 Fisher-Yates 随机播放。在这里阅读更多:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle