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

Algorithmes et structures de données Discussion :

1er terme d'une suite aléatoire, toujours le même a peu près


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut 1er terme d'une suite aléatoire, toujours le même a peu près
    Bonjour.
    Je poste car j'ai fait un petit programme qui utilise la fonction rand() pour générer des nombres aléatoires, et j'ai remarqué qu'après avoir appelé srand(), le nombre généré est sensiblement le même à chaque fois.

    Voilà le programme simplifié :
    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 <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <windows.h>
     
     
    int main (int argc, char **argv)
    {
    	srand ((unsigned int)time (NULL));	// Intitalisation du générateur de nombre aléatoires.
     
    	Sleep (1000);	// Pour une heure differente
     
    	printf("%d", rand ());
    }
    Hier et aujourd'hui encore, ca vaut toujours environ 18000.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Le sleep n'apporte rien ici.

    J'ai le vague souvenir d'une libc buggee qui presentait ce symptome (cad le premier nombre aleatoire etait toujours le meme, les suivants dependant de la graine), peut-etre celle de Borland? A ta place, je reposerais la question sur le forum consacre au C ou au compilateur utilise (ou je demanderais a un moderateur de deplacer la question).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Bonjour à tous.

    Juste une indication qui vous aidera peut-être: à propos de la fonction RAN(I), le manuel de mon Compaq Fortran indique que I (entier sur 4 octets) est la "graine" qui doit être initialisée à une valeur impaire et suffisamment grande. A chaque appel, la fonction modifie la valeur de ce paramètre qui sera réutiliser lors du prochain appel.

    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  4. #4
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut j'ai eu le même problème
    la solution:

    srand(time(NULL));
    srand(rand()*rand());

  5. #5
    Membre actif
    Inscrit en
    Mars 2008
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 209
    Points : 227
    Points
    227
    Par défaut
    le problème est très simple : il suffit de faire appelle à la fonction randomize() ...
    cette fonction donne à la fonction rand; rnd ; ou random un nouveau Seed...
    ainsi la chaine aléatoire obtenue est différente à chaque fois...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Le sleep n'apporte rien ici.
    C'est pour ne pas avoir deux fois la même graine, même quand j'execute le programme plusieurs fois de suite.

    J'ai le vague souvenir d'une libc buggee qui presentait ce symptome (cad le premier nombre aleatoire etait toujours le meme, les suivants dependant de la graine), peut-etre celle de Borland?
    Visual Studio 2008, donc pas de borland.

    valeur impaire et suffisamment grande
    Ma doc ne spécifie pas ça.

    il suffit de faire appelle à la fonction randomize()
    La différence entre randomize et srand, d'après ma doc, c'est que randomize est une macro et qu'elle ne fait pas partie du C standard.

    salut j'ai eu le même problème
    la solution:

    srand(time(NULL));
    srand(rand()*rand());
    Merci, ça marche correctement maintenant (enfin à premières vue, je n'ai pas fait d'analyse statistique).

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 02/05/2015, 17h21
  2. Boucler sur une suite d'input de même class
    Par arthuro45 dans le forum jQuery
    Réponses: 17
    Dernier message: 11/03/2011, 08h51
  3. calcul d'un terme general d'une suite
    Par s-ehtp dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 14/10/2007, 00h17
  4. Réponses: 8
    Dernier message: 02/12/2005, 18h07
  5. Copier un .com sur le 1er secteur d'une disquette
    Par zdra dans le forum Assembleur
    Réponses: 5
    Dernier message: 23/08/2002, 18h03

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