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