Если Вы не знаете длину списка, то необходимо будет пересечь его завершенный для обеспечения случайных выборов. Метод, который я использовал в этом случае, является тем, описанным Tom Hawtin ( 54070 ). При пересечении списка Вы сохраняете k
элементы, которые формируют Ваш случайный выбор к той точке. (Первоначально Вы просто добавляете первое k
элементы, с которыми Вы встречаетесь.) Затем с вероятностью k/i
, Вы заменяете случайный элемент от своего выбора с i
th элемент списка (т.е. элемент, который Вы в, в тот момент).
легко показать, что это дает случайный выбор. После наблюдения m
элементы (m > k
), у нас есть это каждый из первых m
, элементы списка являются частью Вас случайный выбор с вероятностью k/m
. То, что это первоначально хранения тривиально. Тогда для каждого элемента m+1
, Вы помещаете его в свой выбор (заменяющий случайный элемент) с вероятностью k/(m+1)
. Теперь необходимо показать, что все другие элементы также имеют вероятность k/(m+1)
из того, чтобы быть выбранным. У нас есть это, вероятность k/m * (k/(m+1)*(1-1/k) + (1-k/(m+1)))
(т.е. вероятность, что элемент был во времена списка вероятность, что это все еще там). С исчислением можно прямо показать, что это равно [1 112].
Настройки -> C / C ++ -> Редактор -> Выделение неактивного кода
Ага! ; -)