C ++ `srand ()` функция, производящая шаблон? - PullRequest
0 голосов
/ 17 октября 2018

Новичок в C ++ и следующий учебник для начинающих здесь .Обратитесь к разделу под названием Случайные числа в C ++ .Используя именно такой код:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main () {
   int i,j;

   // set the seed
   srand( (unsigned)time( NULL ) );

   /* generate 10  random numbers. */
   for( i = 0; i < 10; i++ ) {
      // generate actual random number
      j = rand();
      cout <<" Random Number : " << j << endl;
   }

   return 0;
}

Я сею srand() с time() (скомпилировано с g++), и поэтому сгенерированный результат должен быть полностью случайным.Однако вот результат, который я получаю:

$ ./a.out
 Random Number : 1028986599
 Random Number : 491960102
 Random Number : 561393364
 Random Number : 1442607477
 Random Number : 813491309
 Random Number : 1467533561
 Random Number : 986873932
 Random Number : 1373969343
 Random Number : 411091610
 Random Number : 761796871
$ ./a.out
 Random Number : 1029003406
 Random Number : 774435351
 Random Number : 36559790
 Random Number : 280067488
 Random Number : 1957600239
 Random Number : 1937744833
 Random Number : 1087901476
 Random Number : 684336574
 Random Number : 1869869533
 Random Number : 621550933
$ ./a.out
 Random Number : 1029020213
 Random Number : 1056910600
 Random Number : 1659209863
 Random Number : 1265011146
 Random Number : 954225522
 Random Number : 260472458
 Random Number : 1188929020
 Random Number : 2142187452
 Random Number : 1181163809
 Random Number : 481304995

Как видно из первого числа, сгенерированного при каждом выполнении ./a.out, первое число в 10-цикле увеличивается при каждом выполнении.И это, кажется, всегда около 1.02 миллионов.Дальнейшее тестирование показывает, что этот паттерн всегда выполняется, и это не совпадение.

Я могу только предположить, что он увеличивается из-за начального числа time(), которое всегда увеличивается.Но это говорит о том, что функция rand() не является действительно случайной и предсказуемой.

1 Ответ

0 голосов
/ 17 октября 2018

Но это говорит о том, что функция rand () не является случайной и предсказуемой.

Да, это абсолютно правильно.Как правило, rand реализуется с очень простым генератором псевдослучайных чисел.Использование rand неприемлемо, когда требуются действительно случайные или непредсказуемые числа.

Под капотом ваша реализация, вероятно, использует Линейный конгруэнтный генератор , и все три примера - всевнутри того же линейного интервала, по крайней мере, для первого выхода.

...