Во-первых, просто чтобы уточнить, любой алгоритм, который вы придумаете, будет генератором псевдослучайных чисел, а не настоящим генератором случайных чисел. Поскольку вы будете создавать алгоритм (то есть писать функцию, то есть создавать набор правил), генератор случайных чисел должен будет в конечном итоге повторить себя или сделать что-то подобное, что не будет случайным.
Примерами действительно генераторов случайных чисел являются генераторы, которые улавливают случайный шум от природы и оцифровывают его. Это включает:
http://www.fourmilab.ch/hotbits/
http://www.random.org/
Вы также можете купить физическое оборудование, генерирующее белый шум (или какое-либо другое средство для случайности) и зафиксировать его в цифровом виде:
http://www.lavarnd.org/
http://www.idquantique.com/true-random-number-generator/products-overview.html
http://www.araneus.fi/products-alea-eng.html
Что касается генераторов псевдослучайных чисел, то самыми простыми для изучения (и теми, которые обычный непрофессионал, вероятно, мог бы сделать самостоятельно) являются линейные конгруэнтные генераторы. К сожалению, это также одни из худших PRNG.
Некоторые рекомендации по определению того, что является хорошим PRNG, включают:
- Периодичность (каков диапазон доступных чисел?)
- Последовательные числа (какова вероятность того, что одно и то же число будет повторяться дважды подряд)
- Единообразие (выбирается ли число из определенного поддиапазона с такой же вероятностью, как и из другого поддиапазона)
- Сложность его обратного проектирования (если он близок к действительно случайному, то кто-то не сможет вычислить следующее число, которое оно сгенерирует, на основе нескольких последних сгенерированных чисел)
- Скорость (насколько быстро я могу сгенерировать новый номер? Требуется 5 или 500 арифметических операций)
- Я уверен, что есть другие, которых мне не хватает
Одним из самых популярных сейчас, который считается хорошим в большинстве приложений (т.е. не в криптографии), является Mersenne Twister< /а>. Как видно из ссылки, это простой алгоритм, возможно, всего 30 строк кода. Однако попытка придумать эти 20 или 30 строк кода с нуля требует большого ума и изучения PRNG. Обычно самые известные алгоритмы разрабатываются профессором или профессионалом отрасли, который десятилетиями изучал PRNG.
Я надеюсь, что вы изучите ГПСЧ и попробуете создать свой собственный (попробуйте для начала «Искусство компьютерного программирования» или «Численные рецепты») Кнута, но я просто хотел изложить все это, чтобы в конце дня (если только ГПСЧ не станут вашими работа всей жизни) гораздо лучше просто использовать то, что придумал кто-то другой. Кроме того, я хотел бы отметить, что исторически компиляторы, электронные таблицы и т. д. не используют то, что большинство математиков считают хорошими ГПСЧ, поэтому, если вам нужны высококачественные ГПСЧ, не используйте стандартную библиотеку. в C++, Excel, .NET, Java и т. д., пока вы не изучите, с чем они это реализуют.
person
Jason Moore
schedule
02.05.2011