Russian Qt Forum
Апрель 29, 2024, 08:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: аналог mt_rand  (Прочитано 5043 раз)
thechicho
Гость
« : Октябрь 05, 2011, 23:16 »

подскажите аналог php функции http://php.net/manual/ru/function.mt-rand.php (или ее реализацию)

ща у меня так пока что
Код
C++ (Qt)
qint64 mt_rand(qint64 a, qint64 b)
{
   //qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
   return qrand()%(b-a+1)+a;
}

qint64 a = mt_rand(100000, 999999);
генерирует, что-то вроде:

129358
100491
100153
121726
109894
107711
112859
101842
123805
103548
107376
121538
129658
128745
116512
115574
103430
110383
124946
101655

что совсем нехорошо.
« Последнее редактирование: Октябрь 05, 2011, 23:18 от thechicho » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Октябрь 05, 2011, 23:56 »

qsrand() в начале программы не забыл?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #2 : Октябрь 06, 2011, 09:16 »

а чо толку? пробовал и в мейн, и в конструктор пихать qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
все равно с 1 число начиналось.

сделал так:
Код
C++ (Qt)
qint64 nach = mt_rand(1, 9);
qint64 kon = mt_rand(00000, 99999);
QString rnd = QString("%1%2").arg(nach).arg(kon);

по другому нельзя?
раз костыль, два костыль и готова прога на Qt
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Октябрь 06, 2011, 09:27 »

#define   RAND_MAX   0x7FFF
Т.е. числа генерируются от 0 до 32767. Отсюда и ваша проблема.
Записан
thechicho
Гость
« Ответ #4 : Октябрь 06, 2011, 09:34 »

объясните, плиз, нубу чо это значит.
и как решить мою проблему "правильно"
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Октябрь 06, 2011, 09:49 »

это значит, что результат выполнения функции в посте №1 и №3 (второй вызов) будет всегда qrand() + a

чтобы расширить диапазон, надо писать свой генератор, используя линейный конгруэнтный метод к примеру
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Октябрь 06, 2011, 10:03 »

объясните, плиз, нубу чо это значит.
Ваш диапазон 100000 - 999999 шире чем генерируемый qrand() поэтому не весь ваш диапозон будет покрыт.

Самый простой вариант:
Код
C++ (Qt)
quint64 extrand()
{
   return qrand() + qrand() * ( RAND_MAX + 1 );
}
 
qint64 mt_rand(qint64 a, qint64 b)
{
   return extrand()%(b-a+1)+a;
}
Записан
thechicho
Гость
« Ответ #7 : Октябрь 06, 2011, 10:33 »

// линейный конгруэнтный метод к примеру
 Веселый

сенкс за помощь)
Записан
thechicho
Гость
« Ответ #8 : Октябрь 06, 2011, 17:36 »

Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Октябрь 06, 2011, 18:55 »




 Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 22.