Вы используете отбор проб из резервуара .
Это не слишком сложно и не дорого; это минимальный подход с учетом имеющихся у вас ограничений (выбор элемента из потока).
Это прекрасно работает, если вы хотите, чтобы размер случайной выборки равнялся 1, и если все элементы имеют одинаковый вес.
Когда вы упростили код с k, равным 1, и без явного взвешивания, это все еще выборка из резервуара.
Не все генераторы псевдослучайных чисел работают с одинаковой скоростью; выберите быстрый.
В комментариях спрашивается, что произойдет, если вы будете использовать одно и то же случайное число вместо того, чтобы генерировать новое случайное число каждый шаг:
Ссылка на Википедию показывает эквивалентность перемешиванию Йейтса-Фишера / Кнута. Если бы вы спросили, что будет означать одно и то же случайное число на каждом шаге шаффла, вы будете лаять.