Мне нужно выбрать n
записи случайным образом из набора n
(где 0 < n < N
).
Возможный алгоритм:
Итерации по списку и для каждого элемента, сделайте вероятность выбора =
(number needed) / (number left)
Итак, если у вас было 40 элементов, у первого был бы шанс
5/40
на выбор.Если это так, следующая имеет шанс
4/39
, в противном случае имеет шанс5/39
. К тому времени, когда вы доберетесь до конца у вас будут ваши 5 предметов, и часто вы будете иметь их все до этого.
Предполагая хороший генератор псевдослучайных чисел, правильно ли этот алгоритм?
Примечание
В stackoverflow есть много таких вопросов (многие из них отмечены как дубликаты Выберите N случайных элементов из списка <T> в С#).
Этот алгоритм часто предлагается (например, Kyle Cronin) и он всегда подвергается сомнению (например, см. здесь, здесь, здесь, здесь...).
Могу ли я получить последнее слово по этому поводу?