Как правильно использовать функцию rand () в C ++? - PullRequest
7 голосов
/ 13 июля 2009

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

#include "std_lib_facilities.h"

int randint()
{
    int random = 0;
    random = rand();
    return random;
}

int main()
{
    char input = 0;
    cout << "Press any character and enter to generate a random number." << endl;
    while (cin >> input)
    cout << randint() << endl;
    keep_window_open();
}

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

    srand(5355);

Который только что сгенерировал одно и то же число снова и снова (теперь я чувствую себя глупо для его реализации.)

Так что я подумал, что буду умен и внедряю семя вот так.

srand(rand());

В основном это было то же самое, что и программа вначале, но выводило другой набор чисел (что имеет смысл, поскольку первое число, сгенерированное rand (), всегда 41).

Единственное, что я мог придумать, чтобы сделать это более случайным, это:

  1. Пользователь должен ввести число и установить его в качестве начального числа (что было бы легко реализовать, но это последнее средство) OR
  2. Каким-то образом можно задать начальное значение для часов компьютера или другого постоянно меняющегося числа.

Я нахожусь над моей головой и должен ли я сейчас остановиться? Трудно ли реализовать вариант 2? Есть другие идеи?

Заранее спасибо.

Ответы [ 5 ]

27 голосов
/ 13 июля 2009

Вариант 2 не сложный, вот и все:

srand(time(NULL));

вам нужно будет включить stdlib.h для srand() и time.h для time().

8 голосов
/ 13 июля 2009

srand () следует использовать только один раз:

int randint()
{
    int random = rand();
    return random;
}

int main()
{
    // To get a unique sequence the random number generator should only be
    // seeded once during the life of the application.
    // As long as you don't try and start the application mulitple times a second
    // you can use time() to get a ever changing seed point that only repeats every
    // 60 or so years (assuming 32 bit clock).
    srand(time(NULL));
    // Comment the above line out if you need to debug with deterministic behavior.

    char input = 0;
    cout << "Press any character and enter to generate a random number." << endl;

    while (cin >> input)
    {
        cout << randint() << endl;
    }
    keep_window_open();
}
6 голосов
/ 13 июля 2009

Обычно генератор случайных чисел заполняется текущим временем. Попробуйте:

srand (время (NULL));

4 голосов
/ 13 июля 2009

Проблема в том, что если вы не запустите генератор, он запустит себя с 0 (как если бы был вызван srand(0)). PRNG предназначены для генерации одной и той же последовательности при одинаковом заполнении (из-за того, что PNRG на самом деле не случайные, это детерминированные алгоритмы и, возможно, немного, потому что это весьма полезно для тестирования).

Когда вы пытаетесь засечь случайное число, используя

srand(rand());

вы делаете:

srand(0);
x = rand();   // x will always be the same.
srand(x);

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

0 голосов
/ 13 июля 2009

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

создание (псевдо) случайных чисел нетривиально и стоит исследовать различные методы их генерации. Я не думаю, что авторы просто имели в виду использование rand ().

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