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 :

Fonction rand rend le meme nombre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Par défaut Fonction rand rend le meme nombre
    Bonjour,

    J'écris un prorgramme utilisant la fonction rand(), sauf qu'à chaque compilation et exécution du programme, c'est toujours le même nombre aléatoire qui est choisi :

    Les instructions du programme principal sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a = Random(1, 8);
    printf("Le nombre aléatoire choisit est :  %d" ,a);
    La fonction est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Random (int a, int b)
    {
        return rand()%(b-a) +a;
    }
    À chaque fois que je compile le fichier, j’obtiens le nombre « 2 », je devrais changer les bornes de Random pour qu'il me choisisse un nombre différent. Le problème vient de quoi ? Je veux avoir un nombre différent à chaque compilation.

    Merci.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Par défaut
    Bonjour,
    je suis pas sur de mon coup, mais sur certain OS, tu es obligé d'initialiser ton nombre aléatoire.
    Tu dois avoir quelques choses de se genre a rajouter:
    srand ( time(NULL) );

    C'est pour des raisons de sécuriser, on initiale l'ago de calcul pseudo aléatoire, pour le rendre encore plus aléatoire
    Cordialement

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Oui, c'est ça srand sert à définir une base pour la génération de nombres pseudo aléatoires (d'ailleurs si tu lui passes une constante, il générera toujours les mêmes nombres d'une exécution à l'autre). En lui passant time (NULL), on s'assure d'avoir une suite de nombre "imprévisible" (à moins de savoir très exactement quand la fonction sera appelée, ce qui est peu vraissemblable).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    srand (time (NULL));
    printf("Le nombre aléatoire choisit est : %d" ,Random(1, 8));
    (Edit : mon message faisait suite à celui de emardjean)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Citation Envoyé par emardjean Voir le message
    C'est pour des raisons de sécuriser, on initiale l'ago de calcul pseudo aléatoire, pour le rendre encore plus aléatoire
    Cordialement
    Ce n'est pas pour des raisons de sécurité : c'est dû au fait que si tes nombres sont choisis par un algorithme, ils seront forcément « pseudo-aléatoires » : si tu rétablis l'état initial et que tu relances l'algorithme dans un système clos, alors tu obtiendras forcément le même résultat car le programme n'a aucun moyen de savoir si c'est la première fois qu'il est lancé ou s'il l'a déjà été un millier de fois auparavant.

    Dans ces conditions, chaque chiffre tiré dépend exclusivement du précédent et, donc, la séquence sera toujours la même. C'est pour cela que srand() te permet de fixer la valeur de la « graine » (seed) à partir de laquelle tous les autres nombres seront générés.

    C'est pour cela qu'on utilise traditionnellement « time() » comme graine puisque, par définition, l'heure actuelle est toujours différente à chaque exécution. Mais là encore, cette méthode a des limites : time() est précise à la seconde près. Si tu lances plusieurs processus en cascade, si tu fais une boucle dans ton programme ou si tu lances plusieurs fois le même programme depuis la ligne de commande, tu obtiendras toujours le même nombre pendant une durée d'une seconde. C'est ce qui était arrivé ici : http://www.developpez.net/forums/d12...-aleatoires-c/ . En plus, si l'heure est toujours différente, elle est en revanche parfaitement prévisible.

    Pour résoudre ce problème, soit tu utilises une fonction qui te donne une précision à la micro-seconde ou inférieure, soit tu sauvegarde l'état courant du générateur à chaque fois que tu quittes ton programme et tu t'en sers comme graine au redémarrage, soit tu utilises le contexte extérieur, en te basant sur des choses incalculables par nature, comme les mouvements de la souris de l'utilisateur.

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    j'en profite pour parler d'une solution qui n'est pas souvent citée. Sous unix (mais il y a un équivalent sous windows) il est facile de lire /dev/random ou /dev/urandom ...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    as-tu initialisé le générateur aléatoire par srand() avec un paramètre dépendant du temps ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <time.h>
    ....
    srand(time(NULL));

Discussions similaires

  1. fonction rand() sur liste ?
    Par debutant-1 dans le forum C
    Réponses: 10
    Dernier message: 24/05/2006, 10h58
  2. Fonction qui rend un pointeur
    Par WaM dans le forum C
    Réponses: 6
    Dernier message: 20/05/2006, 19h31
  3. Algo de la fonction RAND
    Par booby dans le forum C
    Réponses: 3
    Dernier message: 21/04/2006, 14h25
  4. fonction rand() php
    Par taka10 dans le forum Langage
    Réponses: 5
    Dernier message: 12/04/2006, 13h35
  5. Fonction qui rend nul le bouton d'alimentation ?
    Par rpoulin dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2005, 05h03

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