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 :

Optimisation programme (pas tirer deux fois un même entier)


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Optimisation programme (pas tirer deux fois un même entier)
    Bonjour à tous, je suis tombé sur ce petit défis et j'aimerais optimiser mon programme (moins de lignes ou de façon plus élégante) mais je n'ai plus d'idées.
    Mon but et dans mon boucle de sortir des nombres aléatoires entre 0 et 9 et de les afficher uniquement s'ils sont pas sortis exemple : 6152231134 affichera : 615234. J'ai pensé à créer un tableau pour stocker les valeurs sorties et à le remplir uniquement s'il ne contient pas la valeur. Le programme est fonctionnel :

    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
     
    int main()
    {
        srand(time(NULL));
        int N=50,dedans=0,i,j,size=0;
        int* temp = calloc(N ,sizeof(int));
        for (i = 0; i < N ; i++) {
            int X = rand()%10;
            for(j=0;j<size && dedans!=1;j++){ //parcours notre tableau de valeur stockées, on sort si dedans == 1 
                if(temp[j]==X){
                    dedans=1;
                }  
            }
            if(dedans==0){
                    //s'il est pas dedans
                    temp[size]=X;
                    printf("%d",X);
                    size++;
            }
            dedans=0;
        } 
        return 0;
    }
    PS: je free mon tableau

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Citation Envoyé par Nestati Voir le message
    J'ai pensé à créer un tableau pour stocker les valeurs sorties et à le remplir uniquement s'il ne contient pas la valeur.
    oui.
    Sinon éventuellement utiliser des listes chaînées.
    Mais c'est plus complexe à mettre en oeuvre et si c'est pour quelques nombres un tableau suffit.

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 206
    Points : 847
    Points
    847
    Par défaut
    comme tu ne vas afficher que des chiffres
    un tableau à 10 éléments suffit
    tu n'as plus qu'à mettre un flag Y/N pour dire si déjà affiché

    rapidement (pas testé)
    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
    int main ()
    {
        srand(time(NULL));
        int N=50,i, X;
        int tab[10];
     
        for (i = 0; i < 10 ; i++) tab[i] = 0;
     
        for (i = 0; i < N ; i++) {
            X = rand()%10;
            if (tab[X] == 0)
            {
                printf("%d",X);
                tab [X] = 1;
            }
        }
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,

    la solution classique pour ce genre de problème : créer un tableau avec les entiers de 0 à M (facile, ici M=9), appliquer un mélange de fisher-yates (pas compliqué), afficher les n premiers éléments (avec n≤M) où n est le nombre de nombres que l'on veut (hyper simple).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Xelland Voir le message
    comme tu ne vas afficher que des chiffres
    un tableau à 10 éléments suffit
    tu n'as plus qu'à mettre un flag Y/N pour dire si déjà affiché

    rapidement (pas testé)
    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
    int main ()
    {
        srand(time(NULL));
        int N=50,i, X;
        int tab[10];
     
        for (i = 0; i < 10 ; i++) tab[i] = 0;
     
        for (i = 0; i < N ; i++) {
            X = rand()%10;
            if (tab[X] == 0)
            {
                printf("%d",X);
                tab [X] = 1;
            }
        }
    }
    Superbe solution je n'y avais pas pensé. Merci beaucoup

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Nestati Voir le message
    Superbe solution je n'y avais pas pensé. Merci beaucoup
    Je vais y apporter 2 améliorations
    • remplacer srand(time(NULL)) par srand(time(NULL)^getpid()). En effet, en environnements multiusers il peut arriver que le programme soit exécuté au même instant par deux users distincts (voire même un seul user qui travaillerait dans différentes fenêtres). Donc le time() serait le même. Mais pas le même n° pid (n° processus)
    • remplacer rand()%10 par rand() / (double)RAND_MAX * 9. En effet, cette expression où on divise un nombre compris entre 0 et RAND_MAX par RAND_MAX offre une plage aléatoire plus équiprobable qu'un simple modulo. Et ne pas oublier rand_r() si on veut travailler en multithread.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2017, 23h56
  2. Ne pas avoir deux fois la même valeurs
    Par diki38 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/01/2010, 11h45
  3. Ne pas créer deux fois un même objet
    Par manest dans le forum Langage
    Réponses: 2
    Dernier message: 07/01/2010, 23h02
  4. [AC-2007] Ne pas imprimer deux fois la même chose
    Par Flup dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 24/11/2009, 20h47
  5. [Perl POO] ne pas créer deux fois le même objet
    Par seben dans le forum Langage
    Réponses: 4
    Dernier message: 30/03/2009, 21h19

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