crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как в Qt работает qsrand и qrand
eldar85
  опции профиля:
сообщение 9.4.2010, 0:42
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


не могу понять как написать так чтобы выходила кстрока типа dfkjgi49vjodj55 - ну что то вроде этого))
что нужно вставить в функцию
qsrand(...); ???
в асистенте эта функция нифига не описана... может кто использовал и знает?
хотелось бы чтобы узнать как установить длину рандомного выражения и чтобы можно было и числа и буквы чтобы выдавал))

вот тут вроде числа получаются, но как сделать чтобы и буквы были и длинну можно было регулировать
 qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));


вот нашел как число получить например от 1 до 100
qrand()%100;

но опять же мне нужно чтобы одной длинны был код, к примеру 123456789 из 9 чмсел ну и буквы нужны...

хорошо бы и чисто буквенный рандом найти...

вот придумал как сделать рандом из пяти букв, блин но опять же проблема))) он еще с буквами и символы туда впихивает
QString d;
QString d2;
for(int j=0; j<5; j++)
{
d = qrand()%65^90;
d2.append(ddd);
d="";
}


в итоге такая шняга:
"qXIzd"
"}_T|O"
"JJ{kL"

вроде кодировку ascii поставил от 65 до 90, по идее должны же только большие латинские буквы выдаваться, а тут один хрен такая жопа...

проблема косяков была в том что хоть и пишешь
qrand()%65^90;

а он один хрен то 115 выдаст, то еще что нить))) в общем выходит за границы между 65 и 90...

пришлось сделать проверку на соответствие
int i;
for(int j=0; j<5; j++)
{
i = qrand()%65^90;
if(i<65 || i>90)
{
    j--;
}
else
{
   d.append(i);
}
i=0;
}

в итоге пять нормальных чисел выдает))
"TFPHV"
"MRWJP"
"BSQNE"
"SEWMP"
"PAWYB"
"AWKFJ"

вот так вполне уникальная хреновина получается))
int randInt1;
int randInt2;
QString d;
for(int i=0; i<5; i++)
{
randInt2 = qrand()%48^57;
randInt1 = qrand()%65^90;
if(randInt2>=48 && randInt2<=57)
{



if(randInt1<=65 || randInt1>=90)
{
    i--;
}
else
{
   d.append(randInt1);
   d.append(randInt2);
}
}
else
{
    i--;
}
randInt1=0;
randInt2=0;
}
qDebug() << d;


"O3I1V7M9F8"
"V1K8R5S4R7"
"N5H3B4M8I1"
"E8F1G8W7E0"
"O8F5C2E7R4"
"T8I1W5M3H2"
"G1I8J0B7W2"
"E4S7F1N3C3"
"H1O3G0O3C8"
"B3I7J6G9M2"
"L9K4W9M2R5"

но тут такая махина получилась, может все же есть универсальная рандомная функция с которой не придется так мозг греть, а просто задать в нее параметры типа [a-zA-Z0-9] к примеру и указть сколько символов чтобы выдала...

Сообщение отредактировал eldar85 - 9.4.2010, 0:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 9.4.2010, 0:56
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Вы неправильно используете операцию "^".

К примеру:
randInt2 = qrand()%48^57;

что будет, если qrand() даст вам 5?


Вам нужно что-то вида

randInt2 = qrand()%25 + 65;

Сообщение отредактировал ufna - 9.4.2010, 0:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 9.4.2010, 10:00
Сообщение #3


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


не правельно? если не сложно подскажите что дает тогда операция "^" и "+"??)

randInt2 = qrand()%25 + 65;

спасибо, понял как работает, это получается будет вызываться любой из 25 символово после 65 в таблище ascii)))
большое спасибо))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 9.4.2010, 12:32
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


ну "^" - битовый xor. Причем здесь вообще эта операция? Она не гарантирует, что результат будет обязательно меньше "b" :)

;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 9.4.2010, 20:32
Сообщение #5


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


почему то такой код
randInt2 = qrand()%25 + 65;

при каждом новом запуске программы выдает одинаковое число... если прога работает в цикле то выдаст разных вариантов, но при новом запуске программы все эти варианты тут же начинают повторяться в том же диапазоне...
получается вызвал я в цикле три раза, вышло три разных числа, закрыл прогу, запустил снова и снова теже три числа один в один...
не подскажите как бороться с этим???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.4.2010, 20:43
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(eldar85 @ 9.4.2010, 21:32) *
почему то такой код
randInt2 = qrand()%25 + 65;

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

Посмотри на void qsrand ( uint seed )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 9.4.2010, 21:36
Сообщение #7


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


да спасибо, подставил уже
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));

и отлично все работает)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 12.4.2012, 11:10
Сообщение #8





Гости








    


int randInt;
QString myString;
for(int i=0; i<5; i++)
{
randInt = qrand()%('Z'-'A'+1)+'A';
myString.append(randInt);
}
qDebug() << myString;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Андрей_*_*
сообщение 28.3.2013, 12:14
Сообщение #9





Гости








    


Вот так описано использование в документации
http://www.developer.nokia.com/Community/W..._integers_in_Qt

#include <QGlobal.h>
#include <QTime>

int QMyClass::randInt(int low, int high)
    {
    // Random number between low and high
    return qrand() % ((high + 1) - low) + low;
    }
// Create seed for the random
// That is needed only once on application startup
QTime time = QTime::currentTime();
qsrand((uint)time.msec());

// Get random value between 0-100
int randomValue = randInt(0,100);


Сообщение отредактировал ViGOur - 29.3.2013, 10:03
Причина редактирования: Отредактировал не нужную и огромную цитату
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 20:41