![]() |
|
|
![]()
|
|
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Использую стандартную функцию Си rand() для генерации случайных чисел, т.к. в Qt qrand() в описании было указано что это генератор псевдослучайных чисел. Потом прочитал на каком то форуме что стандартная функция Си rand() тоже как бы псевдо случайные числа генерирует.
1. Подскажите какую функцию лучше использовать? 2. Действительно ли rand() псевдо случайные числа генерирует, если да то я так понимаю что и rand() тоже надо таймером NULL заряжать как и qrand, что бы получать действительно уникальные числа. 3. Как создать действительно уникальное число? 4. Насколько уникальна моя функция генерирования ключа? Я лично создавал 700 тысяч ключей и не было ни одного совпадения... Спасибо за ответы !
-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: нет Всего: 12 |
Да, псевдослучайное. Нужно заряжать каким-нибудь рандом-сидом srand(чего-то там). Исходить из действительно случайного фактора, например из питания на ядре процессора и т.п. |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
вод код ф-ции qrand().
как видишь, она отличается от Си-шной rand() только под линукс, да и то в части Thread-Local-Storage'а Псевдо-случайная последовательность - это когда следующее случайное число зависит от предыдущего, но обратной зависимости нет. Если не вызывать srand() с уникальным числом (таймер(NULL) - вполне подойдёт), то при следующем запуске твоей программы (не функции, а программы) генератор будет выдавать абсолютно такую же последовательность. genGUID или как-то так... погугли "генерация GUID"
Если не делать srand(), то после перезапуска программы ты получишь точно такую же последовательность ключей. Это сделано специяально, чтобы удобнее было отлаживаться -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| loneybibi |
|
||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Т.е. если я в начале функции сделаю вот так:
То получу почти настоящие случайные числа ?
В данный момент использую GUID, но генерирует слишком длинный и сложный ключ! Вот если бы его заставить генерировать ключ как у меня Просто ключ должен быть читабелен для пользователя обязательно ну это уже слишком сложный вариант -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||
|
|||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
нет. этот вызов нужно делать один раз в программе. и не такой, как у тебя, а такой
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Насчет "абсолютно такой же последовательности", заметил что на ОС Window да это действительно так что при каждом запуске программы идет такая же последовательность чисел если не зарядить srand(). Но на ОС Linux даже если не заряжать srand() ключи получаются уникальными даже при повторном запуске последовательности не совпадают, и ни одного ключа тоже не совпадает сделал сначала один раз 100 тысяч, перезапустил программу и еще 100 тысяч, совпадений ключа нет. -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: нет Всего: 5 |
думаю автор хотел умножить время на случайное число, но тогда как-то так надо писать:
|
||||
|
|||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Да это и имел ввиду но если srand() можно вызывать только один раз то как я понял так уже не получится ? Добавлено через 13 минут и 34 секунды Я уже задумываюсь об QUuid. Генерировать им ключ, из него взять 12 символов взять их по четыре и разделить тире. Что бы было что то на подобии моего ключа на вид, уже ладно что не по маске буква и три цифры. Но в таком случае QUuid дает полноценно уникальный ключ с использованием шумов процессора или что то подобного или как ? -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: нет Всего: 5 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
не то, чтобы не получится, просто нет смысла. достаточно первые три-четыре проверить... а вообще-то странно, что отличаются рез-ты... у тебя "чистый" проект под линукс ? никакие библиотеки больше не включены ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Ограничений то на вызов то нет.. просто что из этого получится ... Вот borisbn говорит что делать вызов srand() нужно только один раз в программе .. и я так понимаю где то в main.cpp это лучше сделать один раз и все ... Добавлено через 2 минуты и 44 секунды Да чистый проект. Подключена только Sql библиотека, я создавал базу что бы записывать туда ключи и проверять на совпадение. -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Сделал вот так. Насколько это уникально будет?
-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
Вот неплохой генератор. Быстрый и проходит различные статиcтические тесты.
Это сообщение отредактировал(а) afiskon - 23.6.2011, 16:33 |
|||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Не только смысла нет, но ещё получится менее случайная последовательность. Например, если вызвать два раза в течение одной секунды, получишь то же число. Сташие биты чисел, выдаваемых генераторов более случайны. Поэтому, если нужно число в пределах 0...n-1 вместо
лучше использовать
В Linux srand() вызывется автоматически до вызова main(). Но если использовать qrand(), то нужно вызвать qsrand() в любом случае. |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
и что, это никак нельзя отменить ? а как же отлаживать проект ? например, сгенерил ты последовательность, на которой программа падает. при след. запуске она уже не упадёт. вот и думай - из-за того, что ты что-то изменил, или просто последовательность данных не приводит к падению... можно, конечно каждый раз записывать последовательность в файл, и, если упала, "проигрывать" его, но имхо это ужасный изврат. как-то в венде "честнее" сделано... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |