Перетасовка Фишера-Йейтса: случайная, если она остановлена ​​после m раз?

У меня есть целые числа 1,2,3,...,n, из которых я должен случайным образом выбрать m ‹ n различных целых чисел. Я намерен поместить эти целые числа в массив, а затем использовать перетасовку Фишера Йейтса:

Случайным образом выберите запись в массиве. Поменяйте местами с последней записью. Затем случайным образом выберите запись в массиве, кроме последней записи. Поменяйте местами это со 2-й последней записью. Повторяйте до тех пор, пока таким образом не будут получены последние m записей.

Вопрос

Насколько я понимаю, если продолжить до n раз, все возможные варианты равновероятны при этой перетасовке. Таким образом, при остановке после m ‹ n раз каждое расположение последних m записей равновероятно. Следовательно, последние m записей — это m случайных различных целых чисел, которые мне нужны.

Правильно ли я понимаю?


person Legendre    schedule 24.11.2012    source источник
comment
да. (Этот ответ даже короче, чем требуется для публикации комментария....)   -  person Dante May Code    schedule 24.11.2012
comment
Вы только что заново изобрели отбор проб из резервуара.   -  person finnw    schedule 27.11.2012
comment
@finnw - Хорошая ссылка. Спасибо, что указали на это. +1   -  person Legendre    schedule 28.11.2012


Ответы (1)


Да, пожалуй, проще идти вперед:

Пусть rand(z) вернется в диапазоне [0..z)

for (int i = 0; i < m; i++)
    swap(X[i], X[i+rand(n-i)])

X[0..m-1] теперь случайная выборка

person Andrew Tomazos    schedule 24.11.2012