Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt : 5.10.1 - Qt Creator : 4.6.0 - Qt Installer : 3.0.4 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - QBS : 1.11.0

[Qt4] Tirer un nombre aléatoirement

Voici ma question :

Normalement j'utilise les lib :
-stdlib.h
-time.h

et en amorcent le tout avec :
-srand(time(NULL));

je peux utiliser la fonction :

-int alea = 0 + (rand() % 5);


Mais depuis que j'utilise MinGW32 ca ne marche plus.
Voyez vous un moyen pour faire la même chose sous Qt ?

Réponses

  • Ya said:
    Mais depuis que j'utilise MinGW32 ca ne marche plus.
    C'est à dire? Si c'est un problème de compil, quel(s) message(s)?
    Là, tu as clairement un problème, et je doute qu'il faille l'ignorer.

    Sinon, Qt a l'air de proposer qrand(), mais je t'encourage à fixer ton problème d'abord ;)
    Et je sais pas s'il proposer un initialiseur; j'en doute fort :/
  • Voici ma fonction :
    for (int intTirage = 10 ; intTirage <= 60 ; intTirage++)
    {
    if (intTirage >= 10 && intTirage <= 19){taille = 1;}
    if (intTirage >= 20 && intTirage <= 29){taille = 2;}
    if (intTirage >= 30 && intTirage <= 39){taille = 3;}
    if (intTirage >= 40 && intTirage <= 49){taille = 4;}
    if (intTirage >= 50 && intTirage <= 59){taille = 5;}

    while (QStringTirage.length() != taille)
    {
    int alea = 0 + (rand() % 5);
    QStringTirage += QString::number(alea);
    }
    QString temp = QString::number(intTirage);
    insert.exec("insert into App values('" + QString::number(intTirage) + "', '" + QStringTirage + "', '', '')");
    }</div>
    et voila la sortie :
    13
    13
    13
    13
    13
    13
    13
    13
    13
    13
    134
    134
    134
    134
    134
    134
    134
    134
    134
    134
    1340
    1340
    1340
    1340
    1340
    1340
    1340
    1340
    1340
    1340
    13402
    13402
    13402
    13402
    13402
    13402
    13402
    13402
    13402
    13402
    13402
    Le temps ce serait 'il arrété ? ;)
  • Est tu sûr pour qrand() ?
    Je trouve rien dans l'aide de Qt...
  • November 2006 modifié
    salut,

    lu dans la page de manuel de rand() :
    Si vous désirez engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant les bits de poids forts, comme dans :

    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

    et jamais ainsi :

    j=1+(rand() % 10);
    Ca ne résoudra peut être pas ton souci, mais ça aidera peut être à avoir des nombre "plus" aléatoires.

    Aute chose :
    if (intTirage >= 10 && intTirage <= 19){taille = 1;}
    if (intTirage >= 20 && intTirage <= 29){taille = 2;}
    if (intTirage >= 30 && intTirage <= 39){taille = 3;}
    if (intTirage >= 40 && intTirage <= 49){taille = 4;}
    if (intTirage >= 50 && intTirage <= 59){taille = 5;}
    ... semble pouvoir être remplacé par
    taille = intTirage / 10;
    EDIT: comme l'a justement fait remarquer lud42fr ci-dessous, il y avait une erreur de typo, c'est l'opérateur '/' et pas l'opérateur '%' qu'il faut utiliser.

    Pour ton problème proprement dit, je pense que c'est parce que tu oublie de réinitialiser ta variable QStringTirage juste avant ton while. Ajoute quelque chose du genre "QStringTirage = QString::null;" et ça devrait marcher mieux.

    En effet, si j'ai bien tout suivi:

    - au premier passage dans ta boucle while, ton QStringTirage a une longueur de zéro, donc il va faire une fois le rand(). Il trouve '1' dans ton exemple.

    les 9 fois suivantes ( 11
    int id = 10;
    for (int taille = 1 ; taille <= 5 ; ++taille)
    {
    for (int tirage = 0 ; tirage <10 ; ++tirage)
    {
    QString nbAleat;
    // ici nbAleat est réinitialisé à chaque itération de 'for (int tirage ...'
    // car la variable est détruite et reconstruite à chaque itération.
    for (int charNb = 0 ; charNb < taille; ++charNb)
    {
    nbAleat += QString::number(rand() %5);
    }
    insert.exec("insert into App values('" + QString::number(id++) + "', '" + nbAleat + "', '', '')");
    }
  • November 2006 modifié
    Ya said:
    Voici ma fonction :
    for (int intTirage = 10 ; intTirage <= 60 ; intTirage++)
    {
    if (intTirage >= 10 && intTirage <= 19){taille = 1;}
    if (intTirage >= 20 && intTirage <= 29){taille = 2;}
    if (intTirage >= 30 && intTirage <= 39){taille = 3;}
    if (intTirage >= 40 && intTirage <= 49){taille = 4;}
    if (intTirage >= 50 && intTirage <= 59){taille = 5;}

    while (QStringTirage.length() != taille)
    {
    int alea = 0 + (rand() % 5);
    QStringTirage += QString::number(alea);
    }
    QString temp = QString::number(intTirage);
    insert.exec("insert into App values('" + QString::number(intTirage) + "', '" + QStringTirage + "', '', '')");
    }</div>
    et voila la sortie :
    [snip...]
    Le temps ce serait 'il arrété ? ;)
    Non, tu fais juste mal ton rand ;)
    Un rand s'utilise correctement ainsi:
    int r = static_cast<int>(rand() / static_cast<double>(RAND_MAX) * max) + min;
    // max est la borne maximale, min étant ta borne minimale, 0 apparemment, donc tu peux virer ce terme
    C'est la seule façon d'obtenir une bonne répartition des éléments tirés.
    Ya said:
    Est tu sûr pour qrand() ?
    Je trouve rien dans l'aide de Qt...
    Ben, si :P
    Fais une recherche et/ou regarde dans la liste des fonctions. Mais je pense plus que sérieusement qu'il s'agit d'une macro, bien que j'arrive pas à la trouver dans les sources pour l'instant :D

    edit: image, et en bien mieux ;)
  • if (intTirage >= 10 && intTirage <= 19){taille = 1;}
    if (intTirage >= 20 && intTirage <= 29){taille = 2;}
    if (intTirage >= 30 && intTirage <= 39){taille = 3;}
    if (intTirage >= 40 && intTirage <= 49){taille = 4;}
    if (intTirage >= 50 && intTirage <= 59){taille = 5;}
    ... semble pouvoir être remplacé par
    taille = intTirage %10;
    Moi j'aurais vu :
    taille = intTirage/10;
    Ludo
  • Tout à fait exact, désolé pour la coquille. J'ai édité le post concerné et indiqué la correction de l'erreur.
  • il y a qsrand pour initialiser
  • November 2006 modifié
    Je trouve que cette question a sa place dans la section programmation C/C++,
    j'ai démarré un sujet car je me pose une question par rapport à certains des posts de ce sujet :
    http://qtfr.dergen.fr/forum/viewtopic.php?pid=13608
  • Thalgrin said:
    Je trouve que cette question a sa place dans la section programmation C/C++
    Exact, c'est vrai que j'avais pas percuté. Sujet déplacé dans la section C / C++ donc.
  • http://qtfr.dergen.fr/forum/viewtopic.php?pid=13608 que j'ai crée avant le déplacement de ce topic fait maintenant double emploi du coup :lol: Une fusion ?
  • Si c'est mon accord que tu souhaite (ce dont je ne suis pas bien sûr) , tu l'as, bien évidement ...
    Voila voila !!
  • Je suis pas certain qu'on puisse fusionner 2 threads :D
Connectez-vous ou Inscrivez-vous pour répondre.