Как правильно использовать функцию rand () в C++?

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

#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. пользователь вводит число и устанавливает его как семя (что было бы легко реализовать, но это последнее курорт) Или
  2. каким-то образом семя будет установлено на компьютерные часы или какой-то другой постоянно меняющийся номер.

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

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

5 ответов


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

srand(time(NULL));

необходимо указать stdlib.h на srand() и time.h на time().


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();
}

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

srand (time (NULL));


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

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

srand(rand());

вы фактически делаете:

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

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


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

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