Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Генератор равномерного распределения[0,1] не rand


Автор: SlHunter 8.12.2007, 14:07
Здравствуйте! Хотелось бы увидеть реализации хороших равномерных датчиков случайных чисел. Скорость абсолютно не важна, вожно качество, на данный момент я посмотрел 3 датчика:

•cтандартный rand(), т.е линейный конгруэнтный метод, он меня не устраивает совсем ));
•метод Фибоначчи с запаздываниями, который мне не понравился, т.к. его последовательность очень зависимая, ну может быть я накасячил с реализацией;
•ну и метод XorShift, на котором в данный момент остановился.

Датчик нужен для генерирования других распределений, поэтому хотелось что бы он имел хорошее распределение. Кто интересовался данным вопросом прошу помочь. Интересуют именно реализации датчиков на С или С++. 

P.S. Википедию читал всё, что там есть по датчикам, если будете советовать книги, то пожалуйста только те что можно достать в электронном виде.
P.P.S. форум вроде тоже перечитал интересующего меня ничего не нашёл, только ссылки на Кнута, которого я к сожалению не могу найти.

Автор: archimed7592 8.12.2007, 15:20
SlHunter, если нужен качественный генератор, то советую присмотреться к http://boost.org/libs/random/index.html.

Есть ещё один момент: если нужны именно случайные числа(а не псевдо случайные), то тебе понадобится аппаратный генератор этих самых чисел.

Автор: W4FhLF 8.12.2007, 15:32
http://en.wikipedia.org/wiki/List_of_random_number_generators

Автор: SaDFromSpb 8.12.2007, 15:41
SlHunter, еще на RSDN мутили проект качественного генератора. Можешь глянуть у них в списке проектов. Хотя, когда я его там увидел, до реализации дело не дошло еще =)

Автор: SlHunter 8.12.2007, 15:57
archimed7592, Нет абсолютно случайные числа не нужны, наоборот желательно, что бы опыт можно было повторить взяв то же самое начальное число, за Boost.Random спасибо, но желательны исходники, причём такие что б более менее понятные, вроде там нет, или я их ещё не нашёл щас поищу по внимательнее. Судя по всему генератор может быть либо хорошим и сложным, либо плохим и простым ( .... Boost.Random можно взять для сравнения что ли ) 

И если судить по моим заниям английского, этот генератор использует метод http://en.wikipedia.org/wiki/Mersenne_twister, с ОЧЕНЬ большим периодом, что-то типа 2^19937. На Википедии есть псевдо код, попробую его.
 

W4FhLF, я же написал, что Википедию читал.


SaDFromSpb, а можно ссылки, посмотреть хотя бы их идеи алгоритмов.


Может кто знает ещё какие-нибудь алгоритмы, или вдруг кто-то писал свой.


Автор: archimed7592 8.12.2007, 16:04
SlHunter, Boost - это набор абсолютно открытых библиотек, с абсолютно открытыми исходниками, и абсолютно без каких-либо ограничений на использование библиотеки/исходников.
Boost.Random, как и большинство других библиотек из Boost не требует компиляции(подключил boost/random.hpp пользуйся). Что же касается "нужны понятные исходники", то конечно придётся для начала разобраться с устройством библиотеки, потом проще будет вытащить из многочисленных исходников, те, которые относятся к uniform distribution. Но простыми они тебе в любом случае не покажутся smile.

Автор: SlHunter 8.12.2007, 16:28
Ну что ж будем разбираться с этим ) В любом случае пригодитяс, но прошу если у кого, что ещё есть пишите!

Автор: W4FhLF 8.12.2007, 16:41
Цитата(SlHunter @  8.12.2007,  15:57 Найти цитируемый пост)
W4FhLF, я же написал, что Википедию читал.


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

Автор: SlHunter 8.12.2007, 16:49
Ну вдруг там есть не всё, я просто хочу поискать ещё методы, в том числе и самодельные, а так я с тобой согласен моё первое метсо поиска это Википедия.

Автор: W4FhLF 8.12.2007, 17:22
Ну если чисто поресерчить, то из нескольких книг по крито, что я прочёл, мне больше всего понравилась "http://oz.by/books/more104287.html", в частности главы "16. Генераторы псевдослучайных последовательностей и потоковые шифры" и "17. Другие потоковые шифры и генераторы истинно случайные последовательностей". В интернете ищется легко. 

Автор: SlHunter 8.12.2007, 17:49
Спасибо почитаем. Если найду.

Автор: shara 19.12.2007, 02:52
в криптографии есть такое понятие как Линейный Рекурентный Регистр (ЛРР) он по начальному заполнению генерит случайную гамму (0 или 1). в инете ссылок незнаю. кому интересно могу так рассказать, буквально на пальцах. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)