【发布时间】:2022-01-01 03:08:05
【问题描述】:
这是我正在学习的书中的一个程序。我不明白这个程序如何跟踪已经被占用的数字。这本书很简洁,我不明白他们的解释。有人可以帮我更好地理解这段代码的细节吗?特别是代码注释中指出的部分。
#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));
}
【问题讨论】:
-
提示:
while(numbers[b - 1]);与while(numbers[b - 1] != 0);相同 -
我会采取不同的做法:每选择一个数字,我都会将
maxrange(更准确地说:重复!)减一。然后你遍历数组,每个数字小于或等于新的数字,你增加后一个数字。但是,到目前为止选择的数字需要进行排序——只要已经选择的数字更大,您就可以通过排序新的数字来实现。这样,您可以计算出与要选择的球一样多的随机数。 -
顺便说一句:对
rand的结果进行模计算提供了相当差的分布——可能只是玩玩而已,对于更严肃的应用程序你应该更喜欢rand() * (range + 1) / RAND_MAX——取决于@987654327 的大小@ 和RAND_MAX你可能需要考虑溢出。 -
作者应该为
numbers使用更好的名称 - 例如indexTaken. -
意见和风格各不相同。我有点惊讶,还没有人使用“旗帜”这个词。这就是
numbers的含义 - 一组标志,指示选择了哪些数字。