Вы можете генерировать случайные числа, преобразовывать их в двоичные и выбирать элементы из вашего исходного массива, где биты были равны 1. Вот реализация этого в виде обезьяньего патча для класса Array
:
class Array
def random_subset(n=1)
raise ArgumentError, "negative argument" if n < 0
(1..n).map do
r = rand(2**self.size)
self.select.with_index { |el, i| r[i] == 1 }
end
end
end
Использование:
a.random_subset(3)
#=> [[3, 6, 9], [4, 5, 7, 8, 10], [1, 2, 3, 4, 6, 9]]
Как правило, это не так уж плохо, это O (n * m), где n - это количество подмножеств, которое вы хотите, а m - длина массива.