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