Уникальная последовательность случайных чисел с использованием qrand () и qsrand () - PullRequest
3 голосов
/ 29 июля 2009

Я хочу сгенерировать уникальную последовательность случайных чисел в QT, используя QDateTime :: currentDateTime (). ToTime_t () в качестве начального значения, сгенерирует ли qrand () уникальные случайные числа?

Ответы [ 3 ]

8 голосов
/ 29 июля 2009

Нет. qrand может генерировать столько уникальных чисел, сколько умещается в целое число, поэтому - независимо от реализации - вы не можете рассчитывать на уникальность.

Кроме того, зная, что другое начальное число создает другое случайное целое число, можно получить уровень предсказуемости, который фактически делает qrand неслучайным.

Редактировать: Клянусь, я не пытаюсь подшутить над вами, разместив мультфильм; Я думаю, что это довольно хорошее объяснение проблемы:

alt text
(источник: dilbert.com )

6 голосов
/ 02 августа 2009

В зависимости от того, как вы храните свои идентификаторы сеансов, вы можете сгенерировать (в основном) гарантированный уникальный идентификатор, используя UUID. См. Документацию для QUuid. Также помните об этом (жирным шрифтом):

Вы также можете использовать createUuid(). UUID, генерируемые createUuid(), имеют случайный тип. Их QUuid::Version биты установлены на QUuid::Random, а их QUuid::Variant биты установлены на QUuid::DCE. Остальная часть UUID состоит из случайных чисел. Теоретически это означает, что существует небольшая вероятность того, что UUID, сгенерированный createUuid(), не будет уникальным. Но это очень маленький шанс.

Я могу ручаться за то, что эти сгенерированные UUID не обязательно будут уникальными, поэтому, если вам нужно, чтобы они были уникальными, посмотрите на libuuid или что-то подобное.

0 голосов
/ 29 июля 2009

Согласно документации Qt , QRand является просто поточно-ориентированной версией стандартного rand (), я не думаю, что используемый метод более безопасен / превосходит метод rand () на основании этого описания.

Я думаю, что вам нужно использовать терминологию, отличную от «уникальных» случайных чисел (ни один генератор псевдослучайных чисел не создаст уникальный поток, поскольку вход X будет всегда давать выход Y ). Какова фактическая ситуация?

...