Я называю это «проблемой автопилота».
Во-первых: если гарантировано, что число никогда не повторится, оно не очень случайное.
Второй: существует множество алгоритмов PRNG .
ОБНОВЛЕНИЕ:
Третье: есть IETF RFC для UUID (то, что MS называет GUID), но вы должны понимать, что (U | G) UID не криптографически безопасны, если вас это беспокоит.
ОБНОВЛЕНИЕ 2:
Если вы действительно хотите использовать что-то подобное в производственном коде (не только для ваше собственное назидание) пожалуйста, используйте уже существующую библиотеку. Это тот вид кода, в котором почти гарантированно будут небольшие ошибки, если вы никогда не делали этого раньше (или даже если они были).
ОБНОВЛЕНИЕ 3:
Есть много способов генерировать случайные числа. Обычно это делается с помощью системного / библиотечного вызова, который использует генератор псевдо-чисел с семенем, как вы уже описали.
Но есть и другие способы получения случайных чисел, которые требуют специального оборудования для получения ИСТИННЫХ случайных чисел. Я знаю несколько покерных сайтов , которые используют такое оборудование. Очень интересно узнать, как они это делают.
Вы можете использовать этот пример кода: http://xkcd.com/221/ Или вы можете использовать эту книгу: http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477
Но серьезно, не реализуйте это самостоятельно, используйте существующую библиотеку. Вы не можете быть первым, кто сделает это.
Большинство генераторов случайных чисел имеют способ "случайным образом" повторно инициализировать начальное значение. (Иногда называется рандомизацией.)
Если это невозможно, вы также можете использовать системные часы для инициализации начального числа.
В частности, относительно Java:
java.util.Random
использует ] линейный конгруэнтный генератор , который не очень хорош java.util.UUID # randomUUID ()
использует java.security.SecureRandom
, интерфейс для различных криптографически безопасные ГСЧ - по-моему, по умолчанию используется SHA-1. java.util.Random
, такие как Mersenne Twister или умножение с переносом Я понимаю, что вы ищете способ сгенерировать случайное число с помощью C #. Если да, то RNGCryptoServiceProvider - это то, что вы ищете.
[РЕДАКТИРОВАТЬ]
Если вы генерируете довольно большое количество байтов с помощью RNGCryptoServiceProvider, он, скорее всего, будет уникальным, но на него нет гарантии. Теоретически истинные случайные числа не означают, что они уникальны. Вы бросаете кубик 2 раза, и оба раза вы можете получить голову, но они все еще случайны. ИСТИННЫЙ СЛУЧАЙ!
Я думаю, чтобы применить проверку на уникальность, вам просто нужно развернуть свой собственный механизм хранения истории ранее сгенерированных чисел.