Как генерировать "случайные", но и "уникальные" цифры?
Как генерируются случайные числа? Как такие языки, как java и т.д., Генерируют случайные числа, особенно, как это делается для GUID.? Я обнаружил, что алгоритмы, такие как генератор псевдослучайного числа, используют начальные значения.
Но мне нужно создать программу случайных чисел, в которой число, которое когда-то произошло, никогда не должно повторяться, даже если система перезагружена и т.д. Я думал, что мне нужно хранить значения где угодно, чтобы я мог проверить, повторяется ли число или нет, но он будет слишком сложным, если список выходит за пределы.?
Ответы
Ответ 1
Во-первых: если число никогда не будет повторяться, это не очень случайное.
Во-вторых: Есть много алгоритмы PRNG.
UPDATE:
В-третьих: там IETF RFC для UUID (то, что MS вызывает GUID), но вы должны признать, что (U | G) UIDs не криптографически безопасно, если это вас беспокоит.
ОБНОВЛЕНИЕ 2:
Если вы хотите использовать что-то вроде этого в производственном коде (не только для собственного наставления) пожалуйста, используйте уже существующую библиотеку. Это тот код, который почти гарантированно содержит в себе тонкие ошибки, если вы никогда не делали этого раньше (или даже если у вас есть).
ОБНОВЛЕНИЕ 3:
Здесь docs для .NET GUID
Ответ 2
Существует множество способов генерации случайных чисел. Обычно это делается при вызове системы/библиотеки, который использует генератор псевдослучайных чисел с семенем, как вы уже описали.
Но есть и другие способы получения случайных чисел, которые включают специализированное оборудование для получения ИСТИННЫХ случайных чисел. Я знаю некоторые покер-сайты, которые используют этот вид оборудования. Очень интересно читать, как они это делают.
Ответ 3
Большинство генераторов случайных чисел имеют способ "случайно" повторно инициализировать начальное значение. (Иногда называется randomize).
Если это невозможно, вы также можете использовать системные часы для инициализации семпла.
Ответ 4
Вы можете использовать этот пример кода:
http://xkcd.com/221/
Или вы можете использовать эту книгу:
http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477
Но серьезно, не реализуйте его самостоятельно, используйте существующую библиотеку. Вы не можете быть первым, кто сделает это.
Ответ 5
В частности, относительно Java:
Ответ 6
Я понимаю, что вы ищете способ генерации случайных чисел с помощью С#. Если да, RNGCryptoServiceProvider - это то, что вы ищете.
[EDIT]
Если вы создаете довольно длинное количество байтов с помощью RNGCryptoServiceProvider, оно, вероятно, будет уникальным, но нет гарантии. Теоретически истинные случайные числа не означают, что они уникальны. Вы бросаете кости 2 раза, и вы можете получить голову оба раза, но они все еще случайны. TRUE RANDOM!
Думаю, чтобы применить проверку уникальности, вам просто нужно развернуть свой собственный механизм хранения истории ранее сгенерированных чисел.