IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fonction random C++


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Par défaut Fonction random C++
    Bonjours.

    j'ai un petit souci avec cette fonction elle ne me généré pas tout a fait un int aléatoirement c'est toujours les même et dans le même ordre .

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    unsigned int z;
    int x;
    int y = 0;
    int c = 8;
    char texte[30] = "";
    z = random(100);
     
    x = E1 - > Text.ToInt();
     
    if (x < z) {
        L1 - > Caption = "Plus grand";
    } else {
        if (x > z) {
            L1 - > Caption = "Plus petit";
        } else {
            if (x = z) {
                L1 - > Caption = "GG";
            }
        }
    }
    y++;
    sprintf(texte, "%d Essai", y);
    L2 - > Caption = texte;
    if (y == c) {
        L2 - > Caption = "PERDU";
        y = 0;
        Bclik - > Enabled = false;
        Button2 - > Caption = "Réessayer";
    }
    Si vous avais des idées elles seront les bienvenues !

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    random n'est pas une fonction du C++. Donc il faut que tu nous donnes son code

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Par défaut
    mais ce code marche très bien sauf que les valeurs de ma variable sont toujours les mêmes soit 49;4 ... je voudrais que ce soit vraiment aléatoire si random n'est pas une fonction du C++ pourquoi ça fonctionne quand même a moitié et quelle serais la fonction adaptée ?

  4. #4
    Membre chevronné
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Par défaut
    random n'est pas une fonction standard, donc soit c'est définit quelque part dans ton code, soit c'est dans une librairie que tu utilise...

    Après, dans tous les cas, il faut surement l'initialiser avec un graine, mais encore une fois, sans savoir d'où elle vient, difficile d'en dire plus...

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 300
    Billets dans le blog
    2
    Par défaut
    La fonction standard en c++ pour générer des nombres aléatoires est rand(): http://en.cppreference.com/w/cpp/numeric/random/rand

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Par défaut
    r0d

    j'ai essayer avec le code de ton lien ça fonction mais je n'arrive pas a comprendre comment Choisir la valeur maxi de ma variable

    c'est ce que j'ai utiliser pour la rendre aléatoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int rand_variable = std::rand()  ;

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    srandom et random sont des fonctions POSIX et on un comportement similaire à srand et à rand.

    Pour avoir un nombre entre a et b, la formule est assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     rand()/(RAND_MAX - 1)*(b-a) + a
    Où RAND_MAX est une constante définie dans math.h (ou cmath), j'avoue que je ne connais pas le nom exact.

    Cf la FAQ

  8. #8
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    En fait rand() c'est du c.

    En C++11 tu peux utiliser la library <random> qui est plus correcte.

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Par défaut
    Ok je veux bien pour la lib mais quelle serais la fonction exacte en c++ ?

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    dans toutes les questions sur les fonctions standards, il convient de se rapprocher de la documentation correspondante.

    Personnellement, j'utilise cppreference.com.
    Dans ton cas, tu devrais t'intéresser à la section sur <random>

    Je t'invite à passer quelques heures à explorer ce site, tu n'y trouveras pas beaucoup de conseils, mais toutes les spécifictions des fonctions.
    Attention toute fois, les fonctions marqués C++11 ne sont pas forcément toutes disponibles sur tous les compilateurs.

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Par défaut
    Merci a tous pour votre aide.

    J'ai trouver comment faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	srand(time(NULL)); // initialisation de rand
    	for(i=0; i<5; i++)
    	{
    	   z = rand()%t;
    	}

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Attention, si tu met rand()%z, tous les résultats ne seront pas équiprobables (mais bon, c'est relativement négligeable ici).

  13. #13
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 300
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Attention, si tu met rand()%z, tous les résultats ne seront pas équiprobables (mais bon, c'est relativement négligeable ici).
    [mode chipotage ON]Sauf si z est multiple de RAND_MAX [mode chipotage OFF]

  14. #14
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par r0d Voir le message
    [mode chipotage ON]Sauf si z est multiple de RAND_MAX [mode chipotage OFF]
    (M-x mode-super-chipotage-on)
    C'est vrai pour les multiples de RAND_MAX. C'est aussi souvent vrai si z = (2^k)-1, avec k positif, parce que RAND_MAX est bien souvent une valeur de cette forme - dans ce cas, on élimine simplement les bits de poids fort.
    (M-x mode-super-chipotage-off)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Sauf que la valeur de RAND_MAX n'est pas fixée par la norme et dépend de l'implémentation (?).
    Donc dans ce cas là, on ne peut pas considéré que les résultats sont équiprobable s'ils le sont que chez nous et pas chez les autres.

    J'adore chipoter

  16. #16
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Salut,

    comment vous faites pour obtenir un tirage équiprobable à partir d'une distribution qui ne suit pas une loi uniforme?

  17. #17
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    @ALeph69: OK, disons que c'est un abus de langage L'équiprobabilité n'est pas garantie mathématiquement, mais on est quand même dans un cas relativement proche (pas génial, mais ce n'est pas catastrophique non plus).

    @Neckara : historiquement, les valeurs de RAND_MAX sont soit de la forme 2^k, soit de la forme 2^k-1 (cf. http://en.wikipedia.org/wiki/Linear_...tial_generator). En fait, je vais revenir sur mes propos, parce qu'ils partent du principe que le LCG garde les bits de poids faible uniquement - ce n'est pas le cas dans toutes les implémentations, ce qui fait qu'un modul quelconque a 0 chances de donner quelque chose de vaguement uniforme (aux problèmes apportés par le LCG près, histoire de faire plaisir à Aleph69 ).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  18. #18
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par leternel Voir le message
    Attention toute fois, les fonctions marqués C++11 ne sont pas forcément toutes disponibles sur tous les compilateurs.
    Je dirais même qu'ils sont rares. On ne change pas d'environnement de travail comme de chaussettes
    Bah, à propos tiens, y-a-t-il un update/patch pour Visual Studio 2010 qui supporte C++11 ? Ou faut-il se farcir VS2012 ?

  19. #19
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par camboui Voir le message
    Bah, à propos tiens, y-a-t-il un update/patch pour Visual Studio 2010 qui supporte C++11 ? Ou faut-il se farcir VS2012 ?
    Comme d'hab, faut upgrader.
    Mais sinon pour ce qui est de la conformité de la biblio standard au C++11, vs2010 est quand même dans le haut du panier, sa biblio standard est quasiment complète.


    Edit :
    Citation Envoyé par takago
    Ok je veux bien pour la lib mais quelle serais la fonction exacte en c++ ?
    Il me semble que le moyen le plus court et le plus simple avec <random> du C++11 pour obtenir un nombre aléatoire dans un intervalle donné est le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <random>
    #include <time.h>
     
    std::default_random_engine rd_engine(time(NULL));
     
    int rand_(int min, int max)
    {
       std::uniform_int_distribution<> rd_dist(min, max);
       return rd_dist(rd_engine);
    }
     
    int main()
    {
       int r = rand_(1, 6); // tirage équivalent à celui d'un dé 6
    }
    Donc un peu lourdingue...
    Ce qui est dommage avec la lib <random> du C++11 c'est qu'elle est clairement très puissante (on peut sans trop de difficulté sortir des distributions normales, binomiales etc), très customisable, mais il manque une fonction comme rand_ que j'ai définit plus haut et qui en une ligne de code couvrirait la vaste majorité des usages...

    Du coup, je n'utilise quasi jamais <random> de C++11, mais le classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    srand(time(NULL)); // initialisation de rand
    for(i=0; i<5; i++)
    {
       z = rand()%t;
    }
    Bêtement un srand + rand/modulo est plus court à écrire et suffit largement pour quasiment tout :\

  20. #20
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Mais sinon pour ce qui est de la conformité de la biblio standard au C++11, vs2010 est quand même dans le haut du panier, sa biblio standard est quasiment complète.
    Tu as une source ?
    Pour la prise en charge du langage, j'ai ces tableaux : Stdcxx Wiki C++0xCompilerSupport et C++11 Features in Visual C++ 11, mais pas grand chose sur la lib elle même

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Forth] Fonction random
    Par kamfezz dans le forum Autres langages
    Réponses: 3
    Dernier message: 16/04/2023, 14h33
  2. [Fortran 77] Fonction random
    Par ajsd0208 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/07/2005, 12h58
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. [LG]Fonction random
    Par platoon5 dans le forum Langage
    Réponses: 16
    Dernier message: 22/02/2005, 20h47
  5. Fonction Random en Assembleur
    Par chidi dans le forum Assembleur
    Réponses: 5
    Dernier message: 21/05/2004, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo