Как бы вы выбрали единый случайный элемент в связанном списке с неизвестной длиной?

Как бы вы выбрали единый случайный элемент в связанном списке с неизвестной длиной за один проход или если не два прохода?

Ответ 1

Использовать выборку коллектора http://en.wikipedia.org/wiki/Reservoir_sampling. Вам нужен только один проход данных.

Для выбора одного элемента:

  • Выберите первый элемент (вероятность 1)
  • Позже, для k-го элемента выберите его с вероятностью 1/k (т.е. замените существующий выбор на k-ый элемент)

Я позволю вам доказать, что это приводит к равномерному выбору элементов.