Реализовать генератор случайных чисел, используя только 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() внутри цикла это, скорее всего, не поможет:

  1. GCC, скорее всего, оптимизирует ваш цикл задержки.
  2. даже если это не оптимизировано, задержки будут очень похожи, и ваши значения не будут очень случайными.

Я бы посоветовал вам поискать "линейный конгруэнтный генератор" для простого способа генерации большего числа случайных чисел.

Другие вопросы по тегам