Partage
  • Partager sur Facebook
  • Partager sur Twitter

Garnir un vecteur de nombre random sans répétions

    19 janvier 2022 à 13:26:28

    Bonjour à tous … 

    J'ai un petit problème. J'aimerai remplir mon vecteur de nombre aléatoire et cela sans répétions. Mais je n'y arrive pas… 

    Votre aide me serait très précieuse.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define DIM 26
    
    int main()
    {
        int v[DIM];
        int alea,i,j;
    
        //REMISE A ZERO DU VECTEUR
        for(i=0;i<DIM;i++)
        {
            v[i]=0
        }
    
        srand(time(NULL));
    
        for(i=0;i<DIM;i++)
        {
            alea  = rand()%(25+1);
            for(j = 0;j<DIM;j++)
            {
                if(alea == v[j])
                {
                    alea  = rand()%(25+1);
                }
            }
            v[i] = alea;
        }
    
        for(i=0;i<DIM;i++)
        {
            printf("%d ", v[i]);
        }
    
        return 0;
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2022 à 14:13:38

      Si ton tableau et tes nombres aléatoires vont de 0 à 25, tu n'as qu'à initialiser ton tableau avec les nombres de 0 à 25 et ensuite mélanger le tableau.
      • Partager sur Facebook
      • Partager sur Twitter
        19 janvier 2022 à 14:27:01

        Malheureusement je suis obligé d'utiliser la fonction rand()… Je ne peux pas coder mon vecteur en dur
        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2022 à 14:33:05

          Un exemple que j'avais rédigé grace à une intervention de magma ici présent, il y a bien longtemps :)

          http://fvirtman.free.fr/recueil/01_08_04_02_randshake.c.php

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            19 janvier 2022 à 14:33:10

            Mais tu devras l'utiliser (la fonction rand) pour mélanger le tableau !

            Parce que ce que tu décris correspond exactement au mélange d'un tableau. (Tu as 26 valeur différente (0 à 25) à loger dans ton tableau de taille 26).

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2022 à 14:38:20

              Un algorithme de mélange efficace et simple est celui de Fisher-Yates :

              https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates

              Il utilise un seul tableau évite de se poser la question de savoir combien de fois on permute.

              -
              Edité par Dlks 19 janvier 2022 à 14:38:33

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2022 à 14:40:35

                Bon, puisqu'on est déjà dans les solutions, je donne la mienne :

                #include <stdio.h>
                #include <stdlib.h>
                #include <time.h>
                
                void printTab(int tab[], int size)
                {
                    for(int i=0; i<size; i++) printf("%d  ", tab[i]);
                }
                
                void swap(int *x1, int *x2)
                {
                    int tmp = *x1;
                    *x1 = *x2;
                    *x2 = tmp;
                }
                
                void melange(int *tab, int size)
                {
                    for(int i=0; i<size; i++)
                    {
                        int j = rand()%size;
                        swap(&tab[i], &tab[j]);
                    }
                }
                
                int main(void)
                {
                    srand(time(NULL));
                    int tab[26];
                    for(int i=0; i<26; i++) tab[i]=i;
                
                    melange(tab, 26);
                
                    printTab(tab, 26);
                
                    return 0;
                }



                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2022 à 18:55:14

                  Si on ne veut pas de nombre consécutifs, on peut choisir l'incrément de façon aléatoire comme suit:
                  int base = ...
                  for(int i=0; i<longueur; i++) {
                      tableau[i] = base;
                      base += rand() % increment_maximal + 1;
                  }

                  Et on mélange ensuite.

                  -
                  Edité par PierrotLeFou 19 janvier 2022 à 18:55:49

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                  Garnir un vecteur de nombre random sans répétions

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown