Я пишу генетический алгоритм для решения игры Master Mind. Я провел много исследований по лучшим подходам, и невероятно важно иметь разнообразное население. Я пытаюсь определить, как получить действительно хорошие случайные числа в C ++. я сделал srand(time(NULL))
в начале моей программы, чтобы установить семя, то я просто использовал rand()
, То, что я хотел бы знать, насколько случайно это действительно? Это довольно хорошо? Есть ли другие лучшие библиотеки для случайных чисел?
Я знаю, что теория чисел и случайность — очень сложный предмет; есть ли у вас какие-либо указания по написанию вашей собственной версии rand()
?
Для криптографии вам нужны очень сильные свойства случайных чисел. Большая часть литературы посвящена этим видам требований. Типичным решением будет заполнение итеративных приложений SHA-256 с использованием шума окружающей среды (задержки жесткого диска, сетевые пакеты, движения мыши, RDRAND, HAVEGE, …).
Для симуляции Монте-Карло или приложений ИИ требования к случайности действительно намного ниже. На самом деле очень простые генераторы будут достаточно хороши. Самым основным является пресловутый линейный конгруэнтный генератор, который в настоящее время считается старомодным, поскольку выходные шаблоны иногда приводят к заметным и нежелательным эффектам выборки (в частности, некоторые экспериментальные исследования, проведенные в 70-х и 80-х годах, вполне вероятно имеют недостатки из-за этот). В наши дни Mersenne Twister более популярен и более чем подходит для компьютерной игры. Он доступен в стандартной библиотеке C ++: см. станд :: mt19937.
rand()
Случайность действительно плохая. Это болотный стандарт LCG и вообще имеет плохую случайность и плохое качество проекции. Если вы серьезно относитесь к качеству случайности для своего приложения, вам нужно пойти с чем-то лучшим. Тогда это зависит от того, хотите ли вы придерживаться стандартной библиотеки или нет.
Если вы хотите использовать стандартную библиотеку, перейдите с <random>
Заголовок и Мерсенн Твистер.
Но я бы порекомендовал вам использовать случайная семья PCG вместо. Он быстрый, имеет хорошее качество и исправляет большинство ошибок <random>
,