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 N nombres aleatoires différents


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Générer N nombres aleatoires différents
    Bonjour,

    Je voudrais générer N nombres aleatoires différents entre 0 et 127.

    Donc j'ai utilisé la fonction rand()

    par exemple :

    pour N = 10

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    v1 = rand() %128;
    .
    .
    v10 = rand() %128;

    les nombres générés : v1, V2, V3, V4, V5, V6, V7, V8, V9, V10

    Mais parfoit je trouve que certains nombres sont répétés (exp v1=v6, v3=v9)

    S'il vous plait, y a t il une solution pour générer des nombres aléatoires différents avec la fonction rand() ?

  2. #2
    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
    Bonjour

    Il est toujours possible que la hasard sort 2 nombres aléatoires identiques, surtout dans ton cas où tu n'as que 128 valeurs possibles sur un tirage de 10 valeurs.

    Quelques remarques :
    * as tu bien pensé à initialiser le générateur avec la fonction srand ?
    * utilise les fonctions du C++ plutôt que du C si tu peux (http://en.cppreference.com/w/cpp/numeric/random, en particulier uniform_int_distribution)
    * pourquoi utiliser des variables avec des numéros dans le nom plutôt qu'utiliser un tableau ?

    Si tu veux forcer le nombre d'élément pour avoir 10 nombres aléatoires différents, mets tes nombres dans un std::set ou un std::unordered_set (qui garantie que chaque élément est unique) et teste la taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::unordered_set<int> values;
    for(auto i=0; values.size() < N; ++i) 
        values.insert(rand() % 128);

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    Question que je me suis souvent posé. J'ai une solution, qui utilise le fait que tes valeurs soient petites. C'est Une solution, je ne prétends pas que ce soit la meilleure, est de dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tab[] = un tableau de 127 éléments
    pour i = 0 à 126 faire:
      tab[i] = i
    (*) appliquer des transformations aléatoires au tableau en permutant des valeurs
    pour i = 1 à N faire:
      j = un nombre aléatoire entre 0 et 127 - i
      afficher tab[j]
      enlever le (127 - i) ème élément du tableau (ce qui rétrécit le tableau de 1 à chaque fois)
    fin
    L'étape (*) est nécessaire pour que les valeurs tirées soient aléatoires. Pour cela, tu peux faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour i = 0 à 127/2 faire:
      tirer a et b deux nombres aléatoires entre 0 et 127
      permuter tab[a] et tab[b]
    fin

  4. #4
    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!
    La solution (quasiment) C++esque serait assez directe, puisque l'énoncé inclue les mots "tous différents". Ces mots devrait éveiller un réflexe: std::set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //dans le main
    srand(time(NULL));
    //et là où le besoin s'en fait sentir
    std::set<int> resultats;
    while(resultats.size()<N) resultats.insert(rand()%128);
    Cela laisse encore le problème de l'imperfection de rand()%, il faudrait se tourner vers Boost.random/c++11 pour avoir une bonne réponse.

    EDIT: J'ai raté la réponse de gbdivers ( Tu me pardonneras?)

  5. #5
    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
    @leternel
    On verra... en fonction de la quantité de chocolat que tu m'offriras à Paques

    @rmaker
    Ta solution est intéressante, mais on utilisera ce type d'approche plus par exemple pour créer des partitions d'un ensemble (c'est à dire créer plusieurs sous ensembles deux à deux disjoints)
    En complément, le C++11 ajoute 2 algos dans la STL pour faire ça directement : std::random_shuffle, std::shuffle

Discussions similaires

  1. générer des nombres aléatoire différents
    Par kochfet dans le forum Langage
    Réponses: 2
    Dernier message: 14/05/2014, 11h59
  2. générer un nombre aléatoire gaussien
    Par kayari dans le forum Probabilités
    Réponses: 9
    Dernier message: 24/05/2005, 23h57
  3. nombres aleatoires en plsql
    Par al85 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 29/03/2005, 19h07
  4. 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
  5. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12

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