Реализовать генератор случайных чисел, используя только getpid() и gettimeofday()?
Я использую компилятор gcc для реализации генератора случайных чисел, используя только getpid() и gettimeofday(). Вот мой код
#include <stdio.h>
#include <sys/time.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
struct timeval tv;
int count;
int i;
int INPUT_MAX =10;
int NO_OF_SAMPLES =10;
gettimeofday(&tv, NULL);
printf("Enter Max: \n");
scanf("%d", &INPUT_MAX);
printf("Enter No. of samples needed: \n");
scanf("%d", &NO_OF_SAMPLES);
/*printf("%ld\n",tv.tv_usec);
printf("PID :%d\n", getpid());*/
for (count = 0; count< NO_OF_SAMPLES; count++) {
printf("%ld\n", (getpid() * tv.tv_usec) % INPUT_MAX + 1);
for (i = 0; i < 1000000; ++i)
{
/* code */
}
}
return 0;
}
Я дал внутренний цикл for для цели задержки, но результат, который я получаю, всегда один и тот же - нет. как это
./a.out
Enter Max:
10
Enter No. of samples needed:
10
1
1
1
1
1
1
1
1
1
1
Пожалуйста, поправьте меня, что я делаю не так?
2 ответа
Поместите gettimeofday в цикл. Посмотрите, если getpid() делится на INPUT_MAX + 1, вы всегда получите один и тот же ответ. Вместо этого вы можете добавить getpid() (хотя и не имеет никакого смысла ()) к tv.tv_usec.
getpid()
постоянна во время выполнения программ, поэтому вы также получаете постоянные значения.
Но даже если вы используете gettimeofday()
внутри цикла это, скорее всего, не поможет:
- GCC, скорее всего, оптимизирует ваш цикл задержки.
- даже если это не оптимизировано, задержки будут очень похожи, и ваши значения не будут очень случайными.
Я бы посоветовал вам поискать "линейный конгруэнтный генератор" для простого способа генерации большего числа случайных чисел.