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 des nombres aléatoires entre 2 bornes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut Générer des nombres aléatoires entre 2 bornes
    Bonjour à tous,
    Je chercher à générer des nombres aléatoires dans les bornes d'un intervalle [0 .... mrna_length].
    Après quelques recherches sur internet, j'ai fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
     
    void simulation(int mrna_length, int repeat);
     
    int main()
    {	
     
    	int n_cut = 500 ;
    	int repeat = 10;
    	simulation(n_cut,repeat);
    	return 0;
    }
     
    void simulation(int mrna_length, int repeat){
    	int i,j,k;
    	for(i=0;i<=repeat;i++){
                    /* deux façons de générer des nombres aléatoires dans les bornes d'un intervalle */
    		j = rand()%(mrna_length+1); 
    		k= 1 + (int) ((mrna_length) * (rand() / (RAND_MAX + 1.0)));
    		printf("valeur de j : %d\n",j);
    		printf("valeur de k : %d\n",k);
    	}
    }
    J'ai compilé avec la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wextra test.c -O2 -o programme
    Ensuite je fais .
    Cela me sort bien des nombres aléatoires. Jusque là tout va bien.
    Mais je suis très étonnée, car lorsque je fais à nouveau gcc puis ./mon programme, j'ai toujours la même liste de valeurs aléatoires, dans le même ordre etc.
    Je ne comprends pas pourquoi ?
    c'est surement très bête, mais je débute.
    Merci pour votre aide !

  2. #2
    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
    C'est la magie de l'informatique.
    La fonction rand() ne génère pas des nombres aléatoires.
    Elle génère les valeurs successives d'une suite difficilement prédictible. C'est ce qu'on appelle des nombres pseudo-aléatoires.
    En anglais, on parle de PRNG: pseudo random number generator/ion.

    Il existe une fonction soeur à rand(): srand(seed)Cette fonction initialise la "seed" de la suite générée par rand().

    A chaque fois que tu appelles srand(), la suite est réinitialisée.
    Pour avoir une suite différente à chaque execution, il suffit d'utiliser une seed distincte à chaque fois.

    La technique généralement utilisé, c'est de prendre l'heure actuelle.

    Il faut exécuter cette instruction une seule fois, avant la première fois qu'est appelée rand().

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    D'accord je comprends mieux !
    Effectivement en modifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
     
    void simulation(int mrna_length, int repeat);
     
    int main()
    {	
     
    	int n_cut = 500 ;
    	int repeat = 10;
    	simulation(n_cut,repeat);
    	return 0;
    }
     
    void simulation(int mrna_length, int repeat){
    	int i,j,k;
    	srand(time(NULL));
    	for(i=0;i<=repeat;i++){
    		j = rand()%(mrna_length+1);
    		k= 1 + (int) ((mrna_length-1) * (rand() / (RAND_MAX + 1.0)));
    		printf("valeur de j : %d\n",j);
    		printf("valeur de k : %d\n",k);
    	}
    }
    j'obtiens des nombres différents !

  4. #4
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,


    attention, avec ce code tu auras k dans l'intervalle [1, mrna_length] et non [0, mnra_length]. A priori la seconde méthode te donnera des nombres mieux distribués dans cette intervalle que la méthode avec le modulo.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Ne pas oublier qu'il y a une sur Developpez.com

    http://c.developpez.com/faq/?page=Le...res-aleatoires

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Ne pas oublier qu'il y a une sur Developpez.com

    http://c.developpez.com/faq/?page=Le...res-aleatoires
    Oui effectivement, merci !

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leternel Voir le message
    La technique généralement utilisé, c'est de prendre l'heure actuelle.

    Bonjour

    Même avec l'heure utilisée comme graine, on peut obtenir une suite identique si le même programme est appelé plusieurs fois dans la même seconde. Peu probable certes mais néanmoins possible surtout dans les systèmes Unix/Linux multi utilisateurs (deux users appelant le programme en même temps...)

    C'est pourquoi je prends souvent l'habitude de rajouter le pid (n° de processus) dans la graine. Ce n° étant unique à un instant "t", ça réduit les risques...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srand(time(NULL) ^ getpid());
    Autre possibilité: prendre l'heure codée en millièmes de secondes...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/09/2006, 16h42
  2. Générer des nombres aléatoires
    Par nbeligh dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2006, 16h05
  3. Algo pour générer des nombres aléatoires
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2006, 09h06
  4. Réponses: 2
    Dernier message: 16/05/2006, 17h02
  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