Используйте алгоритм «выбрать случайный элемент из бесконечного списка».
Ведите индекс вашего текущего выбора, а также подсчет количества истинных значений, которые вы видели.
Когда вы видите истинное значение, увеличьте счетчик и затем замените ваш выбор текущим индексом с вероятностью P = (1 / счет). (Таким образом, вы всегда выбираете первое, что найдете ... затем вы можете переключиться на второе с вероятностью 1/2, затем вы могли бы переключиться третьему с вероятностью 1/3 и т. д.)
Для этого требуется только одно сканирование списка и постоянное хранение. (Однако для этого требуется, чтобы вы обрабатывали большее количество случайных чисел.) В частности, он никогда не требует буферизации списка или возврата к началу - так что он может работать с неограниченным входным потоком.
См. этот ответ для примера реализации LINQ простого алгоритма "выбрать случайный элемент"; для этого потребуются незначительные изменения.