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 :

générer aléatoirement un nombre


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Par défaut générer aléatoirement un nombre
    Je veut écrire un programme (en C) qui génére aléatoirement un nombre de n chiffres donnés tel que pas de répétions de chiffres (par exemple : 1231 est interdit tous les chiffres doivent être différents : n=4 _1234, 7658, …, n5_12345,87430…..)
    J’ai proposé cette méthode mais ça ne marche pas :

    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
    30
    31
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <math.h>
     
    main()
    {int i,n,j,max,min,x,e;
    char c[100];
    do
    {printf ("Entrz la taille de la chaine:");
    scanf ("%d",&n);
    max =(int)pow(10.0,(double)(n+1))-1;
    min =(int)pow(10.0,(double)n);
    }
    while ((n<=0) || (n >100));
     
     do
     {x=(rand () % max+1-min) + min;
     itoa (x,c, 10);
     e=0;
     for (i=0;i<n;i++)
     {
     for (j=0;i<n;j++)
     if (c[j]!==c[i])
     e=1;
    }
    }
    while (e=1);
    printf("la valeur est %d;",x);
    system ("pause");
    }

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    d'abord dans ton dernier if il y a un "!" en trop et sinon je ne comprend pas du tout l'utilité de e ! tu le met à 1 quand il y a egalité entre deux chiffre, mais tu ne l'utilise nul par ailleur, a mon avis il faudrait l'utiliser pour la condition de la boucle !
    dans ta deuxieme boucle for il y a aussi un pb: tu as mis i<n ne faudrait il pas plutot j<n ?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Je vois, sans lire complètement le code, au moins 2 trucs:

    1) Pas de répétition de chiffre dans une valeur => n doit être <= 10

    2) la boucle while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((n<=0) || (n >100));
    Je ne pense pas que tes tests soient bon : tant que tu rentres une valeur de 1 à 100, tu n'entres pas dans la boucle, et le (n > 100), une fois que tu auras rétabli les bons tests, te renvoie au 1) [ou alors, explique moi comment avoir plus de 10 chiffres sans en avoir au moins 2 identiques].

    Du coup, je n'ai pas lu plus loin.

  4. #4
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Sachant effectivement que ton nombre ne peux pas avoir plus de 10 chiffres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char c[10];
    int nbDigit=rand() %10;
     
    initDigits();
     for (int i=0;i<nbDigit;i++)
     {
    c[i]:=recupererIemeDigit(rand() % i);
    }
    avec initDigits qui créé une liste chainée des dix entiers 0..9
    et recupererIemeDigit qui te retourne le ième digit de la liste chainée et supprime cette occurence en reconnectant les deux autres extremités entre-elles. (tu peux aussi utiliser un tableau ou tu fais des recopies).

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Citation Envoyé par JMLLB
    Sachant effectivement que ton nombre ne peux pas avoir plus de 10 chiffres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char c[10];
    int nbDigit=rand() %10;
     
    initDigits();
     for (int i=0;i<nbDigit;i++)
     {
    c[i]:=recupererIemeDigit(rand() % i);
    }
    avec initDigits qui créé une liste chainée des dix entiers 0..9
    et recupererIemeDigit qui te retourne le ième digit de la liste chainée et supprime cette occurence en reconnectant les deux autres extremités entre-elles. (tu peux aussi utiliser un tableau ou tu fais des recopies).
    Alors il faut
    le zéro final, toujours lui,

    d'autre part, le modulo 10 pour obtenir des valeurs aléatoires 0<=n<10 est une mauvaise pratique (cherche un peu sur l forum, ça revient assez souvent)

    et encore d'autre part, tu aimes les choses simples, toi !

  6. #6
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    effectivement rand(10) et rand(i) sont plus "sympas" qu'un rand %.
    Même si là je ne pense pas que dans le cas présent il y ai de grands enjeux de perfo ni de risques d'overflow, les bonnes habitudes ne coûtent pas grand chose (et à moi rien du tout, car je n'utilise jamais la fonction rand(), j'aime trop les choses prévisibles ).

    Pour le 11 char pourquoi pas, avec une petite init remplie de retour charriots ça peut être assez pratique.
    Mais on peut très bien s'en sortir autrement en gardant 10 char, tout dépend du traitement derrière.

    Et oui, j'aime les choses simples. Il me semblait que ce pseudo algo l'était (surtout si on fait le choix d'une implémentation par tableau).
    Mais je suis curieux de toute autre solution, plus simple, plus esthétique, plus fun...(enfin je ne promet de rester aussi curieux à la 115e version mais d'ici là...).

Discussions similaires

  1. [Flex4] Générer graphique avec nombre de colonne aléatoire
    Par vaccary dans le forum Flex
    Réponses: 1
    Dernier message: 01/07/2011, 15h59
  2. Réponses: 3
    Dernier message: 20/04/2011, 09h07
  3. Générer un grand nombre de variables aléatoires
    Par hazaki dans le forum Débuter
    Réponses: 3
    Dernier message: 31/01/2011, 10h35
  4. Réponses: 10
    Dernier message: 16/10/2007, 08h28
  5. Réponses: 4
    Dernier message: 25/04/2007, 20h18

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