2016-03-29 1 views
6

Как я могу генерировать семя или хеш, которые сделали бы rand на самом деле случайным? Мне нужно, чтобы он менялся каждый раз, когда он выбирал номер. Новое в C++, поэтому я не совсем уверен, как это сделать. Благодаря! : DКак бы я сделал случайное семя/хеш, чтобы сделать Rand на самом деле случайным?

+0

@DevanshMohanKaushik - Связанный вопрос/ответы в предлагаемом дубликате - это плохое предложение, поскольку они выступают за использование времени в качестве семени - что является плохой практикой и может привести к дублированию случайного оцепенения (между веб-серверами) – Soren

+0

@soren также содержит ссылки на другие полезные ответы, включая тот, который вы упомянули в разделе «Коментарий». – Hummingbird

+0

Этот вопрос предназначен для C++, в то время как отмеченный дубликат запрашивает C. –

ответ

1

Существует не такая вещь, как «фактически случайный» генератор случайных чисел без выборочных данных об окружающей среде или доступа к источнику квантового случайного числа. Рассмотрите возможность доступа к источнику случайных чисел ANU, если вам требуются действительно случайные числа (http://qrng.anu.edu.au/FAQ.php#api).

В противном случае, подталкивания обеспечивает более надежный псевдо-ГСЧ, который должен быть достаточным для большинства целей: http://www.boost.org/doc/libs/1_58_0/doc/html/boost_random.html

+3

Обратите внимание, что большая часть форсирования random была стандартизована с помощью C++ 11, и к ней можно получить доступ через ''. – Yuushi

5

С C++ 11 вы можете использовать std::random_device. Я предлагаю вам посмотреть link для получения исчерпывающего справочника.

Распаковка существенное сообщение по ссылке видео: Вы должны никогда использование srand & rand, но вместо того, чтобы использовать std::random_device и std::mt19937 - в большинстве случаев, следующее будет то, что вы хотите:

#include <iostream> 
#include <random> 
int main() { 
    std::random_device rd; 
    std::mt19937 mt(rd()); 
    std::uniform_int_distribution<int> dist(0,99); 
    for (int i = 0; i < 16; i++) { 
     std::cout << dist(mt) << " "; 
    } 
    std::cout << std::endl; 
} 
Смежные вопросы