Есть 2 функции.
unsigned int get_rand(void)
{
srand(time(0));
int a=rand();
label:
if (a>255)
{
a=a/3;
goto label;//да-да, извращение
}
}
И вторая
volatile unsigned int i, counter, value;
static void handler(void);
unsigned int
get_random(void)
{
struct itimerval x, y;
i = 0;
counter = 0;
value = 0;
x.it_interval.tv_sec = 0;
x.it_interval.tv_usec = 1;
x.it_value.tv_sec = 0;
x.it_value.tv_usec = 1;
if (setitimer(ITIMER_REAL, &x, &y) == -1)
{
perror("get_random()");
return 0;
}
signal(SIGALRM, handler);
while (counter < 8)
i++;
signal(SIGALRM, SIG_IGN);
if (setitimer(ITIMER_REAL, &y, (struct itimerval *) NULL) == -1)
perror("get_random()");
return value;
}
void
handler(void)
{
value = (value << 1) | (i & 0x1);
counter++;
i = 0;
signal(SIGALRM, handler);
}
Да, я согласен, первая весьма крива. Но с виду, обе работают - возвращают
случайное значение от 0 до 255
Спрашивается, какого хрена программа правильно работает при использовании
второй функции и неправильно при использовании первой.
кто-нибудь может объяснить, почему?