тот же номер отображается для одного выхода, но выходной сигнал соответствует ожидаемому, если имеется более 1 выхода - PullRequest
1 голос
/ 01 июля 2011

Это небольшая программа:

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {    
    long x = rand();
cout << x << endl;
}

Всегда отображается 41. Но если я изменяю программу следующим образом,

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
   for( int i = 0 ; i <= 9 ; i++ ) {    
    long x = rand();
cout << x << endl;
  }
}

Вывод соответствует ожидаемому.случайных чисел. ВЫХОД :

41

18467

6334

26500

19169

15724

11478

29358

26962

24464

Но почему я получаю тот же номер при запуске первой программы Как на самом деле работает rand

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Генератор случайных чисел, встроенный в компиляторы, обычно является генератором псевдослучайных чисел. Они обычно используют рекурсивное уравнение для генерации следующего случайного числа и используют начальное число для генерации первого случайного числа. Проверьте эту ссылку .

Чтобы избежать того же случайного числа, что и у первого, вам нужно изменить начальное число. Опять же, то же самое начальное число даст вам то же самое начальное случайное число, а также ту же самую последовательность случайных чисел. Поэтому вы должны менять начальное число при каждом запуске программы / потока.

Чтобы установить начальное значение, вам нужно вызвать srand () . Лучший способ изменить начальное значение каждый раз, когда вызывается srand(), это использовать текущую метку времени: time(0).

3 голосов
/ 01 июля 2011

Вам нужно заполнить генератор случайных чисел с помощью srand.

Это часто делается с помощью:

srand(time(0));

, если каждую секунду появляются разные сериидостаточно.

Функция time просто возвращает текущее время в секундах с начала 1970-01-01 00:00:00 +0000 (UTC).

2 голосов
/ 01 июля 2011

From: http://www.gnu.org/s/hello/manual/libc/ISO-Random.html

Функция: void srand (unsigned int seed)

Эта функция устанавливает seed в качестве начального числа для новой серии псевдослучайных чисел.Если вы вызываете rand до того, как начальное число было установлено с помощью srand, оно использует значение 1 в качестве начального числа по умолчанию.

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

Обычный прием, чтобы затравить rand, заключается в использовании time(0) - в основном считывание системных часов.Это хорошо в простом приложении, которое просто должно быть «в основном случайным».

Но когда действительно важна истинная случайность:

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

Фактически выне следует использовать rand вообще в таком приложении.Вместо этого вы должны использовать другую случайную функцию;возможно тот, который является специфическим для ОС (специально предоставленным для криптографии), или использует истинный физический источник случайных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...