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 :

Probleme nombre aléatoire


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Par défaut Probleme nombre aléatoire
    Bonjour,
    j'aimerai generer 25 nombres aléatoires compris entre 0 et 24 inclus puis les stoker ds un tableau.

    Pour cela je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    srand(time(NULL));
     
    for(i=0;i<25;i++)
    {
     
    	{
    	T[i]=(int) ((double) rand() * (25) / (RAND_MAX+1)); //genere NBCASESCOTE*NBCASESCOTE nbre aléatoire entre 1 et 3 !
    	}
     
    }
    Le probleme est que j aimerai que tous les T[i] soient differents cad que le programme m ait generer tous les nombres en 0 et 24 mais cela aléatoirement.

    Pr cela j'ajoute :

    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
     
     
    i=1;
    j=0;  //intialisation de i et j
     
    while ( i<25 && j<i)
    {
    while ( T[i]==T[j])
    			   {
    			     T[i]=(int) ((double) rand() * (25) / (RAND_MAX+1));
    				 i++;
    				 j++;
     
    			   }
     
     
    i++;
    j++;
    }

    Mais ca ne marche pas ... les nombres generer ne sont pas differents !
    Ou se trouve mon erreur !

    Merci d'avance a tout ceux qui m apporterons leur aide
    Cordialement,

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gotrunkssj Voir le message
    Bonjour,
    j'aimerai generer 25 nombres aléatoires compris entre 0 et 24 inclus puis les stoker ds un tableau.

    Pour cela je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    srand(time(NULL));
     
    for(i=0;i<25;i++)
    {
     
    	{
    	T[i]=(int) ((double) rand() * (25) / (RAND_MAX+1)); //genere NBCASESCOTE*NBCASESCOTE nbre aléatoire entre 1 et 3 !
    	}
     
    }
    Le probleme est que j aimerai que tous les T[i] soient differents cad que le programme m ait generer tous les nombres en 0 et 24 mais cela aléatoirement.

    Pr cela j'ajoute :

    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
     
     
    i=1;
    j=0;  //intialisation de i et j
     
    while ( i<25 && j<i)
    {
    while ( T[i]==T[j])
    			   {
    			     T[i]=(int) ((double) rand() * (25) / (RAND_MAX+1));
    				 i++;
    				 j++;
     
    			   }
     
     
    i++;
    j++;
    }

    Mais ca ne marche pas ... les nombres generer ne sont pas differents !
    Ou se trouve mon erreur !
    Ben tu testes si le nombre [i] (initialisé à 1) est égal au nombre [j] (initialisé à 0) puis une fois que t'as trouvé un nombre différent tu incrémentes i et j. Donc tu testes chaque nombre avec le nombre situé juste avant lui alors qu'il faudrait le tester avec tous les autres précédents déjà générés.
    Par ailleurs tu ne génères pas le nombre [0] et accessoirement t'as une erreur de parenthèses

    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
    for (i=0; i < 25; i++)
    {
        do {
            dup=0;
            T[i]=(int) (((double) rand() * 25) / (RAND_MAX+1));
             for (j=0; j < i; j++)
             {
                 if (T[i] == T[j])
                 {
                      dup=1;
                      break;
                 }
             }
        } while (dup);
    }
    Bon, à vue de nez cet algo devrait marcher. Cependant ce n'est pas un aléatoire tout à fait équitable puisqu'un nombre choisi disparait de la plage des valeurs possibles. c.a.d. qu'au premier nombre t'as un pool de 25 nombres dispo donc chaque nombre a une chance sur 25 d'être choisi mais au second nombre les nombres restants ont maintenant une chance sur 24 d'être choisi. Un aléatoire réellement équitable consisterait à tirer d'un coup les 25 nombres et recommencer tant qu'un nombre se retrouverait en double. Cependant cet algo n'est utilisable que si tu dois tirer N nombres parmi M avec N très petit par rapport à M...

    Autre chose => si tu lances ton programme de façon répétée et assez rapide, tu risques d'avoir deux fois "time(NULL)" qui te renvoie la même chose => tes deux instances de ton programme te donneront les mêmes nombres. Si t'es sur un Unix/Linux tu peux remplacer "srand(time(NULL))" par "srand(time(NULL) ^ getpid())" => ça fait entrer en jeu ton n° de processus dans le générateur de l'aléatoire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu n'as pas compris ce qu'est le tirage aléatoire, ce que tu veux (si j'ai moi-même bien compris) c'est une distribution aléatoire des nombres 0 à 24 dans ton tableau, or ce que tu fais c'est un tirage aléatoire de nombres compris entre 0 et 24 ce qui est très différent.
    Ce que tu peux faire c'est tirer aléatoirement la position des nombres 0 à 24 dans ton tableau, avec une petite boucle tant que lorsque la place est déjà occupée.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Qatar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Par défaut
    Pour creer un nombre aléaratoir il faut utiliser ça déjà..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    srand (time(NULL));
    AleatoNbre = (rand() % (MAX - MIN + 1)) + MIN;

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Ce que tu peux faire c'est tirer aléatoirement la position des nombres 0 à 24 dans ton tableau, avec une petite boucle tant que lorsque la place est déjà occupée.
    Grilled !!!

    Citation Envoyé par OthmanX Voir le message
    Pour creer un nombre aléaratoir il faut utiliser ça déjà..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    srand (time(NULL));
    AleatoNbre = (rand() % (MAX - MIN + 1)) + MIN;
    Ce n'est pas vrai. D'une part tu ferais bien de lire ce que gotrunkssj a écrit car sa formule fonctionne et d'autre part elle est meilleure que la tienne car elle commence par chercher un nombre parmi tous les nombres possibles (entre 0 et RAND_MAX) puis elle divise ce nombre par l'ensemble des nombres disponibles (RAND_MAX + 1).

    Total elle est beaucoup plus étalée que la tienne qui ne fait qu'un simple modulo et offre donc à chaque nombre une équiprobabilité plus grande que la tienne qui revient quasiment à ne prendre en compte que les bits de poids faible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AleatoNbre=(int)(((double) rand() * (MAX - MIN + 1)) / (RAND_MAX+1)) + MIN;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Qatar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ce n'est pas vrai. D'une part tu ferais bien de lire ce que gotrunkssj a écrit car sa formule fonctionne et d'autre part elle est meilleure que la tienne car elle commence par chercher un nombre parmi tous les nombres possibles (entre 0 et RAND_MAX) puis elle divise ce nombre par l'ensemble des nombres disponibles (RAND_MAX + 1).

    Total elle est beaucoup plus étalée que la tienne qui ne fait qu'un simple modulo et offre donc à chaque nombre une équiprobabilité plus grande que la tienne qui revient quasiment à ne prendre en compte que les bits de poids faible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AleatoNbre=(int)(((double) rand() * (MAX - MIN + 1)) / (RAND_MAX+1)) + MIN;
    Je te crois

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Grilled !!!
    Bof, A quelques secondes près...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par OthmanX Voir le message
    Pour creer un nombre aléaratoir il faut utiliser ça déjà..
    Mes commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* -ed- une seule fois dans toute l'execution */
    srand (time(NULL)); 
     
    <...>
     
    /* -ed- autant qu'on veut, mais c'est une solution naive 
               qui favorise les bits de poids faible.
     
              Il y a des formules plus elaborees dans la FAQ.
     */
    AleatoNbre = (rand() % (MAX - MIN + 1)) + MIN;

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Pour faire une permutation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    size = sizeof tab/sizeof *tab;
    for (i = 0; i < size; ++i) {
       tab[i] = i;
    }
    for (i = 0; i < size-1; ++i) {
       int j = i + alea(size-1-i);
       int tmp = tab[i];
       tab[i] = tab[j];
       tab[j] = tmp;
    }
    avec la fonction alea de la FAQ.

    L'utilisation des entiers pour calculer MAX_INT+1 (qui a un dépassement de capacités sur des implémentations courantes) a plus de change de causer des comportements indésirables que l'utilisation du modulo, surtout d'un modulo 25 qui ne posera des problèmes qu'avec un générateur par congruence linéraire ayant des paramètres peu adapté aux machines en complément à 2 et non corrigé (je me demande s'il y a encore des bibliothèques ne corrigeant pas les générateurs par congruence linéaire). Les deux méthodes ont un problème qui est corrigé dans la fonction de la FAQ.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Par défaut
    Encore Merci pour l'aide apportée c'est maintenant tres clair pour moi !

    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
     
    for (i=0; i < 25;i++)
    	{	
        	do {
            	dup=0;
            	D[i]=(int) ((double) rand() * (25) / (RAND_MAX+1));
             	for (j=0; j < i; j++)
             	{
                 	if (D[i] == D[j])
                 	{
                      dup=1;
                      break;
                 	}
             	}
        	} while (dup);
    	}
    Marche parfaitement,
    Encore Merci

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Où on se demande s'il a lu ce que j'ai écrit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. p'tite question de cryptage ( nombre aléatoire )
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 53
    Dernier message: 08/11/2004, 10h07
  2. Nombres aléatoires
    Par Mat 74 dans le forum Assembleur
    Réponses: 20
    Dernier message: 29/08/2004, 13h31
  3. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20
  4. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

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