Russian Qt Forum

Qt => Вопросы новичков => Тема начата: thechicho от Октябрь 05, 2011, 23:16



Название: аналог mt_rand
Отправлено: thechicho от Октябрь 05, 2011, 23:16
подскажите аналог php функции http://php.net/manual/ru/function.mt-rand.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

что совсем нехорошо.


Название: Re: аналог mt_rand
Отправлено: kambala от Октябрь 05, 2011, 23:56
qsrand() в начале программы не забыл?


Название: Re: аналог mt_rand
Отправлено: thechicho от Октябрь 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


Название: Re: аналог mt_rand
Отправлено: LisandreL от Октябрь 06, 2011, 09:27
#define   RAND_MAX   0x7FFF
Т.е. числа генерируются от 0 до 32767. Отсюда и ваша проблема.


Название: Re: аналог mt_rand
Отправлено: thechicho от Октябрь 06, 2011, 09:34
объясните, плиз, нубу чо это значит.
и как решить мою проблему "правильно"


Название: Re: аналог mt_rand
Отправлено: kambala от Октябрь 06, 2011, 09:49
это значит, что результат выполнения функции в посте №1 и №3 (второй вызов) будет всегда qrand() + a

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


Название: Re: аналог mt_rand
Отправлено: LisandreL от Октябрь 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;
}


Название: Re: аналог mt_rand
Отправлено: thechicho от Октябрь 06, 2011, 10:33
// линейный конгруэнтный метод к примеру
 :D

сенкс за помощь)


Название: Re: аналог mt_rand
Отправлено: thechicho от Октябрь 06, 2011, 17:36
(http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif)


Название: Re: аналог mt_rand
Отправлено: LisandreL от Октябрь 06, 2011, 18:55
http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif

(http://imgs.xkcd.com/comics/random_number.png)

 ;)