?

Log in

No account? Create an account
  Journal   Friends   Calendar   User Info   Memories
 

Электронный миссионер

10th May, 2012. 4:40 pm. Генератор случайных чисел

Столкнулся с тем, что мне понадобился генератор случайных чисел с экпоненциальным распределением (да, я такой оригинал). Начал гуглить по теме, нашел способ через достаточно простенькую формулу. Но для формулы нужен чистый и хороший генератор случайных чисел с равномерным распределением. Начал читать о функции rand(), и понял что она меня не удовлетворит по качеству генерации случайных чисел. Если что, то дело происходит в линуксе и компилятор gcc.

Начал изучать матчасть, во первых понял что надо СРОЧНО учить язык! а во вторых, что это весьма тривиальная задача - сгенерировать случайное, пусть и предсказуемое, число с равномерным распределеием.

Работать с /dev/urandom не хочется по идеологическим соображениям.

З.Ы. Я молчу что по началу нашел пример проги, которая потребовала вагон и маленькую тележку фортрановских библиотек. Попарился с ней полтора часа и решил все написать сам

З.З.Ы. Поставил Linux Mint 12, на глаза наворачиваются слезы, такое же УГ как и 11 убунта, плюс сырое как коовье говно... Верните классический гном моей убунте!

Posted via LiveJournal app for iPad.

Read 20 Notes -Make Notes

10th May, 2012. 7:29 pm. Экспоненциальное распределение

Решил похвастаться получившимися результатами. Я не только реализовал это, но и ещё сделал полную проверку. Нет, конечно я лукавлю, по критерию Пирсона или я не проверял, но на глаз всё хорошо.


Гистограмма распределения и проверочная кривая экспоненты


На картинке приведена гистограмма распределения для 1000 000 сгенерированных таким образом случайных чисел.

Выражаю благодарность товарищу eddy_em за наводку на свой пост http://eddy-em.livejournal.com/2573.html и функцию drand48(). В общем-то за основу и была взята програма, там уже приляпал функцию построения гистограммы и проверки.

Свой быдлокод приводить не буду, скажу, что получить экспоненциальное распределение очень просто:

rand_number=-lambda*(log(drand48()));

Где lambda - это интенсивность потока (отсылаю к википедии http://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5)

Read 24 Notes -Make Notes

Back A Day - Forward A Day