Вот и я к тому, что пользовательская функция может быть написана
"несправедливо". Типичная ошибка - последний элемент списка
выбирается реже других. А вообще такая задача решается стандартным образом - по типу сортировки с выбыванием (когда в массиве ищется позиция наименьшего элемента, который затем переставляется местами с первым, а далее алгоритм повторяется с остатком массива на единицу короче, пока в массиве не останется только один элемент). От сортировки ваша задача отличатся только тем, что выбирается позиция не наименьшего элемента, а случайного, в остальном же отличий нет. После сортировки массива его режут на пары в порядке возрастания индекса.