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 :

Nombre aléatoire


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 27
    Par défaut Nombre aléatoire
    Bonjour à tous,
    Existe-t-il un moyen simple de donner un nombre aléatoire compris dans un espace borné ?

    Plus précisément, je souhaite par exemple que mon programme choisisse un nombre compris entre 0 et 1000 de manière aléatoire.

    J'ai tenté d'utiliser srand(time(NULL)) et rand () mais la suite reste toujours la même tant que l'heure ne change pas or je souhaite vraiment quelque chose d'aléatoire.

    Existe-t-il d'autres fonctions (que je ne trouve pas), que se soit des fonctions C ou C++ ça m'est égal ... pourvu que ça marche

    Merci beaucoup pour vote aide

    Steph

  2. #2
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Le man de rand sous linux dit ça :

    "Si vous désirez engendrer un entier aléatoire entre 1 et 10,
    vous devez toujours procéder en utilisant les bits de poids
    forts, comme dans :

    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    "

    Donc en utilisant cette méthode tu auras un entier aléatoire borné (tu as qu'à changer le 1 et le 10). Et initialise bien le générateur de nombre aléatoire en début de programme.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 27
    Par défaut
    super pour avoir un entier aléatoire borné, sauf qu'il n'est pas vraiment aléatoire car la suite générée est toujours la même ... comment faire pour bien initialiser le générateur de nombre aléatoire ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Avec ce code (en C mais bon en C++ c'est guère différent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdlib.h>
    #include <time.h>
     
    int main(void)
    {
    	int i;
    	srand(time(NULL));
     
    	for(i=0;i<100;i++)
    		printf("%d\n",1+(int) (10.0*rand()/(RAND_MAX+1.0)));
     
     return 0; 
    }
    ça marche bien chez moi, j'ai bien des nombres "aléatoires" en sortie.
    Après, ça reste du pseudo aléatoire mais pour des programmes simples c'est suffisant déjà.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 27
    Par défaut
    oui, c'est ce que j'ai fait, mais tant que l'heure ne change pas, alors j'ai toujorus la même suite de nombre et ça pause un pb pour mon application, il me faudrait vraiment quelque chose d'aléatoire.

    Merci en tout cas pour ton code Sylsau (ça me conforte dans mon utilisation) mais n'existe-t-il pas une façon simple et rapide de faire du vrai aléatoire ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Fondateur
    Inscrit en
    Octobre 2002
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Fondateur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 445
    Par défaut
    Ca reste un ordinateur tu pourras jamais faire autre chose que du pseudo aléatoire hein.
    Mais je vois pas où est ton problème en plaçant correctement mon code dans ton programme tu auras un nombre pseudo aléatoire comme tu le souhaites.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Par défaut
    La meilleure solution est alors de se procurer une suite de nombres aléatoires puis de les placer dans un tableau source.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut srand
    le probleme vient du seed :
    Citation Envoyé par MSDN
    time_t time ( time_t * timer );
    Get current time.
    Get the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock.
    Tu as une "seed" toutes les secondes !! pas mieux
    C'est deja pas mal, tu te base sur quoi pour dire c'est toujours la meme suite ???
    Une boucle de 10 valeurs dix fois de suite ??

    Si c'est la cas c'est normal de retrouver les meme valeurs, si tu veux plus d'espace temps (poua trop fort ) il faut faire des seed a chaque lancement des ton rand() avec des seed differents et la c'est vite chiant !!

    Alors franchement une seconde c'est pas assez

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut temps écoulé en millisecondes
    Salut !
    Tu peux peut-etre initialiser ton rand() avec quelquechose remis à jour plus souvent.
    Perso, j'ai déjà utilisé timeb.h (sous linux ; ça doit bien exister ailleurs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <sys/timeb.h>
    ...
      struct timeb t_debut;
      struct timeb t_fin;
      ftime( &t_debut );
      ...
      ftime( &t_debut );
      double temps_ecoule = t_fin.time - t_debut.time;
      temps_ecoule += ( t_fin.millitm - t_debut.millitm ) / 1000.;
    PS : tu pourrais aussi lire des echantillons sur ton entree micro ...

  10. #10
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 27
    Par défaut
    je vous remercie pour votre contribution, merci aussi Dje14 mais je pense que je vais resté simple avec un srand (time(NULL))
    Merci à tous
    Steph

+ 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