У меня есть очень большой диапазон / набор чисел, (1..1236401668096)
, который я бы хотел «перемешать», т. Е. Случайным образом пройти без повторного ввода того же номера.Я буду запускать веб-сервис, и каждый раз, когда поступит запрос, он будет увеличивать счетчик и вытягивать следующее «перемешанное» число из диапазона.Алгоритм должен учитывать, что сервер переходит в автономный режим, имея возможность возобновить обход, используя постоянное значение счетчика (что-то вроде того, как вы можете запустить генератор псевдослучайных чисел и получить то же самое псевдослучайное число с учетом начального числа ина какой итерации вы находитесь).
Мне интересно, существует ли такой алгоритм или выполнимо.Я видел Fisher-Yates Shuffle , но 1-й шаг - это «записать числа от 1 до N», что заняло бы терабайты памяти для всего моего диапазона.Генерация псевдослучайного числа для каждого запроса может работать некоторое время, но по мере заполнения базы данных / дерева коллизии станут более распространенными и могут ухудшить производительность (по моим расчетам вероятность столкновения составляет 0,08% после 1 миллиарда обращений).Есть ли более идеальное решение для моего сценария, или это просто несбыточная мечта?
Причина перетасовки заключается в том, что возможность правильно угадать следующий номер в последовательности может привести к незначительной уязвимости DOS вмое приложение, но также и потому, что уровень представления будет выглядеть намного лучше при более широком распределении чисел (я бы не стал вдаваться в подробности о , что приложение делает).На данный момент я рассматриваю только использование PRNG и работу с коллизиями или перетасовкой срезов диапазона (начиная с (1..10000000).to_a.shuffle
, затем (10000001, 20000000).to_a.shuffle
и т. Д., Когда номера каждого диапазона начинают исчерпываться).
У кого-нибудь из математиков есть лучшие идеи / предложения?