Генерация «трафки™» или распределение по весам
Дима Смирнов применил интересное решение для генерации «трафок» на «Блоговаре»:
$rb = str_pad (decbin (mt_rand (0,64)),6,"0", STR_PAD_LEFT);
$herb = (int) strpos ($rb, "1");Смысл в том, что каждое следующее значение должно выпадать с вдвое меньшей вероятностью, чем предыдущее. Пока я спал, мне пришло в голову довольно забавное решение на ту же тему. Оно быстрее примерно на 30%, не обладает ограничением на размер и точнее вычисляет вероятности (у Димы «трафка» не выпадает с вероятностью примерно 52%), но не решает задачу полностью. Кто скажет в чём разница, не запуская код?
for ($i = 5; $i && mt_rand(0, 1); --$i);
Комментарии 10
И, кроме того, у Вас правильно обрабатывается оставшийся вес — у Димы, например, туда отводится ~1,5625% у вас должные оставшиеся ~3,125%.
Но я побоялся, что люди не поймут, поэтому написал «более понятно».