Хорошо, это один из тех хитрых вопросов, которые звучат, поэтому я перехожу к переполнению стека, потому что не могу придумать хорошего ответа. Вот что я хочу: мне нужно, чтобы Python генерировал простой список чисел от 0 до 1 000 000 000 в случайном порядке, который будет использоваться для серийных номеров (с использованием случайного числа, чтобы вы не могли сказать, сколько из них было назначено, или выполнить синхронизацию атакует так же легко, то есть угадывает следующую, которая появится). Эти числа хранятся в таблице базы данных (индексируются) вместе с информацией, связанной с ними. Программа, генерирующая их, не работает вечно, поэтому она не может полагаться на внутреннее состояние.
Ничего страшного, верно? Просто сгенерируйте список чисел, поместите их в массив и используйте Python «random.shuffle (big_number_array)», и все готово. Проблема в том, что я хотел бы избежать необходимости хранить список чисел (и, таким образом, прочитать файл, вытолкнуть его сверху, сохранить файл и закрыть его). Я бы лучше сгенерировал их на лету. Проблема в том, что решения, о которых я могу думать, имеют проблемы:
1) Создайте случайное число, а затем проверьте, было ли оно уже использовано. Если он использовался, создайте новый номер, проверьте, повторяйте по мере необходимости, пока я не найду неиспользованный. Проблема в том, что мне может не повезти, и я сгенерирую много использованных чисел, прежде чем получу одно неиспользованное число. Возможное решение: используйте очень большой пул чисел, чтобы уменьшить шансы на это (но тогда я получу глупые длинные числа).
2) Создайте случайное число, а затем проверьте, не было ли оно уже использовано. Если он использовался, добавьте или вычтите одно из числа и проверьте снова, повторяйте до тех пор, пока я не нажму неиспользованное число. Проблема в том, что это больше не случайное число, так как я ввел смещение (в итоге я получу сгустки чисел, и вы сможете предсказать следующее число с большей вероятностью успеха).
3) Создайте случайное число, а затем проверьте, не было ли оно уже использовано. Если он использовался, добавьте или вычтите другое случайно сгенерированное случайное число и проверьте снова, проблема в том, что мы вернулись к простой генерации случайных чисел и проверке, как в решении 1.
4) Поглотите его, сгенерируйте случайный список и сохраните его, попросите, чтобы демон поместил их в очередь, чтобы были доступны числа (и избегайте постоянного открытия и закрытия файла, вместо того, чтобы пакетировать его).
5) Генерация случайных чисел намного большего размера и их хеширование (т. Е. Использование MD5) для получения меньшего числового значения, мы должны редко сталкиваться с коллизиями, но я получаю снова больше, чем нужно.
6) Добавлять или добавлять информацию, основанную на времени, к случайному числу (т. Е. Метку времени unix), чтобы уменьшить вероятность столкновения, и опять я получаю большие числа, чем мне нужно.
У любого есть какие-нибудь умные идеи, которые уменьшат шансы на «столкновение» (т. Е. Генерирование уже взятого случайного числа), но также позволят мне сохранить число «маленьким» (т. Е. Менее миллиарда (или тысяча миллионов для ваших европейцев =)).
Ответ и почему я его принял:
Так что я просто пойду с 1 и надеюсь, что это не проблема, однако, если это так, я пойду с детерминированным решением генерации всех чисел и их хранения, так что есть гарантия получения нового случайного числа, и я могу использовать «маленькие» числа (то есть 9 цифр вместо MD5 / и т. д.).