Отдал бы и ползарплаты! Войти !bnw Сегодня Клубы

Самый тупой способ генерировать случайные числа от нуля до нужной верхней границы (не включая), если у тебя есть [псевдо]случайные (устраивающего тебя качества) биты — взять остаток от деления на верхнюю границу. Проблема в том, что это не даст равномерного распределения. Так, например, если брать по 3 бита (минимально необходимое число), а нужно сгенерировать число в [0, 5), то очевидно результат будет вдвое чаще попадать в [0, 3), чем в [3, 5). Так что этот способ настолько тупой, что даже неправильный =).
Следующий — брать по 3 бита, пока не попадёт в нужный диапазон. Очень честный способ. Обеспечивает равномерность. Но выкидывает достаточно дорогие [псевдо]случайные биты. В принципе вероятность с первого раза попасть, куда надо, может быть около ½. Поэтому способ тоже тупой. Так, кстати, делает Питон (вот почему тут такой тег), можете посмотреть: http://hg.python.org/cpython/file/3.3/Lib/random.py функция _randbelow
Ок, хорошо, а кто скажет, как это делать нормально, чтобы распределение было равномерным, но чтобы при этом не выкидывать случайные биты?

Рекомендовали: @stiletto @goren
#GJM4F9 / @dluciv / 4189 дней назад

floor((x/8)*верхний_предел)?
#GJM4F9/7P2 / @goren / 4189 дней назад
@goren x/7 точнее.
#GJM4F9/L4Y / @goren --> #GJM4F9/7P2 / 4189 дней назад
@goren Масштабирование даст то же качество, что и остаток. Правда-правда. Если брать остаток от деления большого числа на верхнюю границу, ведь тоже будет _почти_ равномерно. Чем больше, тем равномернее. И тут тоже. Чем больше диапазон исходных случайных, тем равномернее. Но равномерно не будет.
#GJM4F9/IAR / @dluciv --> #GJM4F9/L4Y / 4189 дней назад
@dluciv Равномерно в любом случае не будет, если псевдорандомно генерятся числа от 0 до 7, а верхний предел, скажем, 5. Какая бы ни была функция из случайных величин в искомый диапазон, какие-то значения она будет выдавать чаще, чем другие, просто потому, что размеры множеств не кратны друг другу.
#GJM4F9/A6F / @goren --> #GJM4F9/IAR / 4189 дней назад
@goren Железно. Но возможно выкинутые биты потом можно как-то переиспользовать?.. Хоршие [псевдо]случайные числа на дороге не валяются =).
#GJM4F9/W47 / @dluciv --> #GJM4F9/A6F / 4189 дней назад
@dluciv Я даже не знаю, где они могут пригодиться. Разве что если потом зачем-то понадобятся случайные значения от 0 до 1.
#GJM4F9/3XZ / @goren --> #GJM4F9/W47 / 4189 дней назад
@goren Тут ещё другая фишка. Они же тоже не совсем случайные: выбросили-то только те сочетания битов, которые не соответствуют определённому критерию =).
#GJM4F9/MD8 / @dluciv --> #GJM4F9/3XZ / 4189 дней назад
@dluciv Ну, скажем, нам нужно от 0 до 5, а выпадает от 0 до 7. 6 и 7 мы выбросили, а можно их взять за 0 и 1. Их будет поровну.
#GJM4F9/17F / @goren --> #GJM4F9/MD8 / 4189 дней назад
@goren Я начинаю думать, что авторы Питона не идиоты, и что чем в каждом частном случае искать, какой из выброшенных битов хороший, а какой плохой (на самом деле похоже «плохой» будет только один), легче на них будет и правда наплевать. А то пойдут уже спекуляции на стыке комбинаторики, теории информации и философии =).
#GJM4F9/14U / @dluciv --> #GJM4F9/17F / 4189 дней назад
@dluciv Я тоже думаю, что это по факту самый дешёвый способ без какого-нибудь хитрого хардварного генератора случайных чисел в произвольном диапазоне. Проще выкинуть ненужные биты, чем как-то их хранить и ещё думать, что с ними делать.
#GJM4F9/J7I / @goren --> #GJM4F9/14U / 4189 дней назад
@dluciv Единственное, что мне лично не нравится в таком подходе — это что он не О(1). Возможно, в риалтаймовых приложениях придётся эту случайную функцию избегать.
#GJM4F9/CIN / @goren --> #GJM4F9/14U / 4189 дней назад
плюнь уже на предрассудки и заюзай плавающую точку. Из распределения [0,1] нужное тебе получится тривиально делением на соответствующий интервал с отбрасыванием дробной части.
#GJM4F9/YVH / @macro / 4188 дней назад
@macro Не могу, там будет неравномерно. См. комменты выше. Не засну.
#GJM4F9/GTS / @dluciv --> #GJM4F9/YVH / 4188 дней назад
@dluciv выше вроде все о целочисленных псевдослучайных.
#GJM4F9/QGU / @macro --> #GJM4F9/GTS / 4188 дней назад
@dluciv тоесть вопрос сводится к нахождению годного способа сгенерировать эту самую равномерную последовательность на [0,1]
#GJM4F9/H7K / @macro --> #GJM4F9/GTS / 4188 дней назад
@macro Нет, не сводится.
#GJM4F9/R26 / @goren --> #GJM4F9/H7K / 4188 дней назад
@goren по какой причине не сводится? На всякий случай напомню - я говорил на о подбрасывании монетки (0 или 1)
#GJM4F9/Y72 / @macro --> #GJM4F9/R26 / 4188 дней назад
@macro Вопрос сводится к невозможности разложить 2^n монеток в другое (не степень двойки) число копилок поровну, если лишние монетки не выкидывать.
#GJM4F9/X8U / @goren --> #GJM4F9/H7K / 4188 дней назад
@goren >На всякий случай напомню - я говорил не о подбрасывании монетки (0 или 1) перечитай это еще раз пожалуйста
#GJM4F9/55T / @macro --> #GJM4F9/X8U / 4188 дней назад
@macro Так и я не об этом.
#GJM4F9/LBC / @goren --> #GJM4F9/55T / 4188 дней назад
@goren ок, переформулирую если у тебя есть сколько-нибудь годный способ получение вещественного равномерного распределения отрезке [0,1] то ты можешь из него получить вообще говорям очень много чего. В частности нужное тебе целочисленное распределение - для этого тебе надо разбить этот отрезок на n (где n - нужное тебе число, не являющееся степенью двойки) и проверить, в какой из них попало вещественное случайное число ( это делается тривиально делением с последующим округлением).
#GJM4F9/G9Y / @macro --> #GJM4F9/LBC / 4188 дней назад
@macro хотя вру, надо делить на единицу, деленную на кол-во промежутков( n+1 тоесть, т.к. ноль тоже должен выпадать равновероятно) и просто отбрасывать дробную составляющую результата.
#GJM4F9/J14 / @macro --> #GJM4F9/G9Y / 4188 дней назад
@macro Напомню, что изначально речь шла о некоторой последовательности случайных битов. Если у тебя есть девайс, который выдаёт хорошие случайные значения в [0,1], то проблема из ОП-поста просто не встаёт.
#GJM4F9/561 / @goren --> #GJM4F9/G9Y / 4188 дней назад
@goren псевдослучайные [0,1] тоже вполне подойдут же
#GJM4F9/DGB / @macro --> #GJM4F9/561 / 4188 дней назад
@macro Так там биты же. То есть, не [0,1], а {0,1}^n.
#GJM4F9/9XQ / @goren --> #GJM4F9/DGB / 4188 дней назад
@goren где там ? я говорил о вещественном [0,1].
#GJM4F9/ES0 / @macro --> #GJM4F9/9XQ / 4188 дней назад
@macro А в ОП-посте вопрос о битах.
#GJM4F9/K8X / @goren --> #GJM4F9/ES0 / 4188 дней назад
@goren тогда читай моей предложение как "забей на биты и возьми вещественное псевдослучайное [0,1]"
#GJM4F9/BVJ / @macro --> #GJM4F9/K8X / 4188 дней назад
@macro Это было бы замечательно, но в реально существующих компах нет вещественных псевдослучайных, только биты.
#GJM4F9/DFP / @goren --> #GJM4F9/BVJ / 4188 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.