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 un nombre entier aléatoire entre deux bornes


Sujet :

C

  1. #1
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut Générer un nombre entier aléatoire entre deux bornes
    Bonjour,

    Je débute en C et je voudrais générer des nombres pseudo-aléatoires entiers compris entre deux bornes. Je trouve beaucoup de réponses sur Internet mais elles sont toutes différentes et ne marchent pas.

    Voici ce que j'ai tapé mais j'obtiens de très grands nombres :

    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
    27
    28
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
     
    int main(int argc,char * argv[])
    {
    	int i;
    	int nombre_aleatoire;
    	int borne_minimale = 0;
    	int borne_maximale = 11;
    	printf("CE PROGRAMME PERMET DE GENERER DES NOMBRES ALEATOIRES COMPRIS ENTRE DEUX BORNES\n\n\n\n");
    	printf("\n\nChoisir la borne minimale : ");
    	scanf("%f",&borne_minimale);
    	printf("\n\nChoisir la borne maximale : ");
    	scanf("%f",&borne_maximale);
    	srand(time(NULL));
    	for(i=0; i<100; i++)
    	{
     
    	nombre_aleatoire = rand();
            printf("\n\n\n%f",ceil(nombre_aleatoire * 1.0 / RAND_MAX)*(borne_maximale-borne_minimale)+borne_minimale);
     
    	}
     
     
    	return 0;
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    N'oublie pas les balises codes.

    Je pense que ceci devrais t'aller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rand()%(borne_maximale - borne_minimale) + borne_minimale;

  3. #3
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut Pourquoi ça ne marche toujours pas ?
    Je te remercie pour ton aide mais j'ai toujours de très grands nombres et je ne vois pas mon erreur, il me semble pourtant avoir respecté les règles de priorité. J'utilise code::blocks 10.05

    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
    27
    28
    29
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
     
    int main(int argc,char * argv[])
    {
    	int i;
    	int nombre_aleatoire;
    	int borne_minimale = 0;
    	int borne_maximale = 11;
    	printf("CE PROGRAMME PERMET DE GENERER DES NOMBRES ALEATOIRES COMPRIS ENTRE DEUX BORNES\n\n\n\n");
    	printf("\n\nChoisir la borne minimale : ");
    	scanf("%f",&borne_minimale);
    	printf("\n\nChoisir la borne maximale : ");
    	scanf("%f",&borne_maximale);
    	srand(time(NULL));
    	for(i=0; i<100; i++)
    	{
     
    	nombre_aleatoire = rand();
            printf("\n\n\n%f",ceil(rand()%(borne_maximale - borne_minimale) + borne_minimale));
     
    	}
     
     
    	return 0;
    }

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Avec ma méthode, tu n'a pas besoin de ceil().

    Sinon, as-tu essayé de faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x = rand();
    printf("min:%d\nmax:%d\nmax-min:%d\nrand():%d\nrand%(max-min):%d\nrand%(max-min)+min:%d\n", borne_minimale, borne_maximale, borne_maximale-borne_minimale, x, x*(borne_maximale-borne_minimale), x*(borne_maximale-borne_minimale)+borne_minimale);
    Avec cela, on devrait savoir à quelle étape il y a un problème

    EDIT : pourquoi utilises-tu des %f alors que tu manipule des int?
    remplace les %f par des %d ça devrait mieux marcher

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh..

    Dans ta solution tu "oublies" que rand() renvoie un entier entre 0 et RAND_MAX...

    La vraie solution est une simple règle de 3, sauf qu'il faut faire le calcul en flottant, quitte à le caster en entier à la sortie...

    valeur = (rand() * (max - min) / RAND_MAX) + min

    Et, pour ne pas faire de divisions entières, si on veut le résultat en entier, il faut alors écrire :

    valeur = (int)(((double)rand() * (double)(max - min) / (double)RAND_MAX)) + min
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut Résolu
    Merci à tous, il fallait bien diviser par rand_max

    Attention, int tronque donc il faut ajouter 1 à la valeur max pour avoir les deux valeurs dans la liste de nombres aléatoires

    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
    27
    28
    29
    30
    31
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
     
    int main(int argc,char * argv[])
    {
    	int i;
    	float nombre_aleatoire;
    	float borne_minimale = 0;
    	float borne_maximale = 11;
    	printf("CE PROGRAMME PERMET DE GENERER DES NOMBRES ALEATOIRES COMPRIS ENTRE DEUX BORNES\n\n\n\n");
    	printf("\n\nChoisir la borne minimale : ");
    	scanf("%f",&borne_minimale);
    	printf("\n\nChoisir la borne maximale : ");
    	scanf("%f",&borne_maximale);
    	printf("\n\n\n");
    	srand(time(NULL));
    	for(i=0; i<100; i++)
    	{
     
    	nombre_aleatoire = rand();
            printf("%d\t", (int)(nombre_aleatoire * (borne_maximale+1 - borne_minimale) / RAND_MAX + borne_minimale ));
     
    	}
     
     
    	return 0;
    }

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par zozoman Voir le message
    Attention, int tronque donc il faut ajouter 1 à la valeur max pour avoir les deux valeurs dans la liste de nombres aléatoires
    absolument

    les piquets et les intervalles ..

    Cela dépendait si le problème était posé bornes comprises ou non..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Générer des nombres aléatoires entre 2 bornes
    Par Isabella83 dans le forum C
    Réponses: 6
    Dernier message: 18/04/2015, 11h14
  2. [Math / Random] Génération nombre aléatoire compris entre deux bornes
    Par oligig dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 30/06/2013, 17h23
  3. [Free Pascal] Générer des nombres entiers aléatoires dans un tableau et trier celui-ci
    Par praetis dans le forum Free Pascal
    Réponses: 8
    Dernier message: 15/09/2012, 20h57
  4. Calcul du nombre de nombres à digits distincts entre deux bornes
    Par rawsrc dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 4
    Dernier message: 18/05/2011, 09h49
  5. Nombre aléatoire compris entre deux bornes
    Par kokosnuss dans le forum Pascal
    Réponses: 2
    Dernier message: 03/12/2006, 23h07

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