Я пытаюсь думать о элегантном способе получения случайного подмножества из множества в F #Получить случайное подмножество из множества в F #
Есть мысли по этому поводу?
Возможно, это сработало бы: скажем, у нас есть набор из 2 элементов, и нам нужно выбрать подмножество элементов y. Тогда, если бы мы могли генерировать случайное число бит размера x, которое содержит ровно y 2 n, мы эффективно имеем случайную маску с y дырками в ней. Мы могли бы генерировать новые случайные числа, пока не получим первый, удовлетворяющий этому ограничению, но есть ли лучший способ?
Поскольку этот подход неизбежно выполняется плохо, вам лучше преобразовать его в массив, перетасовать, а затем перенести первые результаты в виде набора - его, вероятно, легче читать для загрузки. И если вы _really_ не хотите преобразовывать свой исходный набор в массив, вы все равно можете создать случайную логическую маску, используя подходящий перетасованный массив (с m true и nm false), а затем просто zip массив с набором, фильтровать по маскам и отображать обратно в набор - без преобразования исходного набора в массив и сохранения производительности O (n). –
Ваш фрагмент кода обычно дает мне тот же набор элементов, за исключением последнего. Я получил 4 раза: '[0; 1; 5], [0; 1; 6], [0; 1; 2], [0; 1; 4] '. Очевидно, ** это не случайное ** подмножество. И это происходит из-за этой линии 'yield! set |> Set.remove i' –
'yield!' дает все элементы последовательности, в этом случае исходный набор с одним удаленным элементом ('set |> Set.remove i'), что неверно. Функция должна быть рекурсивной ('let rec randomSubSet n set = ...'), и вы должны «уступить! set |> Set.remove i |> randomSubSet (n-1) '. –