Я использую такой алгоритм.
Есть несколько блоков, один из которых должен быть показан в определенном месте сайта.
У каждого блока есть вес, влияющий на вероятность появления блока.
Складываем вес всех блоков, параллельно формируем матрицу соответствия случайного числа блоку
генерим случайное число от 0 до общего веса всех блоков минус 1.
По полученному числу берем индекс блока из матрицы соответствия.
Матрица соответствия наполняется на этапе подсчета общего веса блоков
например у блока 1 вес 3, у блока 2 вес 3, у блока 3 вес 1, матрица получится такая.
$m3x = Array(
0 => 1,
1 => 1,
2 => 1,
3 => 2,
4 => 2,
5 => 2,
6 => 3,
);
работает все отлично.