Как генерировать "случайные", но и "уникальные" цифры?

Как генерируются случайные числа? Как такие языки, как 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!

Думаю, чтобы применить проверку уникальности, вам просто нужно развернуть свой собственный механизм хранения истории ранее сгенерированных чисел.