Каков правильный способ использования функции rand () в C ++?

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

#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." <> input) cout << randint() << endl; keep_window_open(); } 

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

  srand(5355); 

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

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

 srand(rand()); 

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

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

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

Я нахожусь над моей головой, и я должен остановиться сейчас? Можно ли реализовать вариант 2? Любые другие идеи?

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

Вариант 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 (время (NULL));

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

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

 srand(rand()); 

вы на самом деле делаете:

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

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

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

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

  • Создание случайных, уникальных значений C #
  • Уникальные случайные числа в целочисленном массиве на языке программирования C
  • Почему мои случайные числа всегда одинаковы?
  • objective C: Modulo bias
  • канонический способ рандомизации NSArray в Objective C
  • Как лаконично, переносимо и основательно семя mn19937 PRNG?
  • Каков наилучший способ вернуть случайную строку в текстовый файл с помощью C?
  • Создайте случайную буквенно-цифровую строку в Cocoa
  • Произвольное генерирование букв в соответствии с их частотой использования?
  • Случайное число c ++ в некотором диапазоне
  • Взвешенный случайный выбор из массива
  • Давайте будем гением компьютера.