Как генерировать “случайные”, но также и “уникальные” числа?

Я называю это «проблемой автопилота».

  1. Не используйте кнопки «OK», «Отмена» в нижней части экрана. Посмотрите, как Vista пытается заставить пользователей принять реальное решение.
  2. Отключить кнопки на несколько секунд, отобразить таймер / индикатор времени «Подумать». Таким образом, пользователь не может нажать на автопилот. Пользователи склонны находить это очень раздражающим.
11
задан Binary Worrier 26 May 2009 в 11:11
поделиться

6 ответов

Во-первых: если гарантировано, что число никогда не повторится, оно не очень случайное.

Второй: существует множество алгоритмов PRNG .

ОБНОВЛЕНИЕ:

Третье: есть IETF RFC для UUID (то, что MS называет GUID), но вы должны понимать, что (U | G) UID не криптографически безопасны, если вас это беспокоит.

ОБНОВЛЕНИЕ 2:

Если вы действительно хотите использовать что-то подобное в производственном коде (не только для ваше собственное назидание) пожалуйста, используйте уже существующую библиотеку. Это тот вид кода, в котором почти гарантированно будут небольшие ошибки, если вы никогда не делали этого раньше (или даже если они были).

ОБНОВЛЕНИЕ 3:

Вот документы для идентификатора GUID .NET

18
ответ дан 3 December 2019 в 05:36
поделиться

Есть много способов генерировать случайные числа. Обычно это делается с помощью системного / библиотечного вызова, который использует генератор псевдо-чисел с семенем, как вы уже описали.

Но есть и другие способы получения случайных чисел, которые требуют специального оборудования для получения ИСТИННЫХ случайных чисел. Я знаю несколько покерных сайтов , которые используют такое оборудование. Очень интересно узнать, как они это делают.

3
ответ дан 3 December 2019 в 05:36
поделиться

Вы можете использовать этот пример кода: http://xkcd.com/221/ Или вы можете использовать эту книгу: http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477

Но серьезно, не реализуйте это самостоятельно, используйте существующую библиотеку. Вы не можете быть первым, кто сделает это.

0
ответ дан 3 December 2019 в 05:36
поделиться

Большинство генераторов случайных чисел имеют способ "случайным образом" повторно инициализировать начальное значение. (Иногда называется рандомизацией.)

Если это невозможно, вы также можете использовать системные часы для инициализации начального числа.

0
ответ дан 3 December 2019 в 05:36
поделиться

В частности, относительно Java:

0
ответ дан 3 December 2019 в 05:36
поделиться

Я понимаю, что вы ищете способ сгенерировать случайное число с помощью C #. Если да, то RNGCryptoServiceProvider - это то, что вы ищете.

[РЕДАКТИРОВАТЬ]

Если вы генерируете довольно большое количество байтов с помощью RNGCryptoServiceProvider, он, скорее всего, будет уникальным, но на него нет гарантии. Теоретически истинные случайные числа не означают, что они уникальны. Вы бросаете кубик 2 раза, и оба раза вы можете получить голову, но они все еще случайны. ИСТИННЫЙ СЛУЧАЙ!

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

0
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: