Почему это число не случайно? - PullRequest
5 голосов
/ 30 апреля 2011

Для следующего фрагмента кода:

#include<stdlib.h>
#include<stdio.h>

int main()
{
    int x;
    x = rand()%100;
    printf("The Random Number is: %i", x);

return 0;
}

Кажется, что случайное число всегда печатается как 83. Почему это?

Ответы [ 6 ]

6 голосов
/ 30 апреля 2011

Обязательный XKCD ссылка:

enter image description here

Как говорили люди, вам нужно правильно запустить генератор случайных чисел псевдо .

Проблема в том, что он по-прежнему генерирует только псевдо случайных чисел. Большинству «истинных» генераторов случайных чисел требуется доступ к некоторому физическому явлению, которое случайное по природе (например, перекос часов или колебания температуры).

В противном случае ссылка на XKCD не слишком далека от истины. Как и Дилберт.

enter image description here

6 голосов
/ 30 апреля 2011

Большинство генераторов случайных чисел повторяемы.Вы должны запустить генератор перед его использованием, что вы обычно делаете с использованием системного времени.

#include <time.h>
srand(time(NULL));
4 голосов
/ 30 апреля 2011

Поскольку генератор псевдослучайных чисел, используемый rand, всегда инициализируется с одинаковым начальным числом.

Чтобы инициализировать его с другим начальным числом, вы можете использовать функцию srand и инициализировать ее, скажем, srand(time(NULL)).

3 голосов
/ 30 апреля 2011

Поскольку 83 - это случайное число, не так ли?

Если серьезно, полезно иметь программы, обеспечивающие повторяющееся поведение, поэтому по умолчанию rand всегда возвращает одинаковую последовательность чисел, если вы несменить семена.

1 голос
/ 30 апреля 2011

Запустить генератор случайных чисел, включив <time.h> и позвонив srand(time(0)); (отредактировано благодаря моим комментаторам)

0 голосов
/ 11 августа 2012

Вы не можете генерировать случайное число, которое является действительно случайным, до тех пор, пока ваш генератор случайных чисел не получит доступ к действительно случайному физическому явлению, как цитировалось ранее Питером.Но для общего использования вы можете использовать стандартные библиотечные функции C для генерации случайных чисел.Вот пример кода для генерации случайного числа между двумя пределами (максимум и минимум):

#include<stdio.h>
#include<stdlib.h>

#define MIN 1
#define MAX 5
#define QUANTITY 5

int main()
{
     int i;
     //stores the time in seconds
     time_t seconds;
     //getting the system time
     time(&seconds);
     //initializing the random generator with system time
     //as the seed value
     srand((long)seconds);

     for(i = 0; i < QUANTITY; i++)
     {
           printf("%f\t",((float)rand())/RAND_MAX*(MAX-MIN)+MIN);
     }
     printf("\n");

     return 0;
}
...