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 :

valeur aleatoire fonction


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut valeur aleatoire fonction
    bonjour a toutes et tous,
    Dabord le code :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    void create(int *a);
    void show(int *a);
     
    int main()
    {
        int r[10];
        int *pr;
     
        pr = r;
        create(pr);
        show(pr);
     
        return(0);
    }
     
    void create(int *a)
    {
        int x,r;
     
        srand((unsigned)time(NULL));
        for(x=0;x<10;x++)
        {
            r = rand();
            r%=10;
            *a = r;
            a++;
        }
    }
     
    void show(int *a)
    {
        int x;
     
        for(x=0;x<10;x++)
            printf("%d\n",*a++);
    }
    Dans ma fonction create , quel est le role de : r%=10; ?
    D'avance merci de votre aide .

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Je viens de comprendre ! le " r%=10" renvoie une valeur aleatoire contenue entre 1 et 10 .

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Points : 143
    Points
    143
    Par défaut
    Non c'est entre 0 et 9. Et ce n'est pas r%=10 qui renvoie une valeur aléatoire, c'est l'appel à la fonction "rand()" qui renvoie une valeur aléatoire.
    L'instruction r%=10 ne fait qu'affecter à r le reste de la division euclidienne de l'ancienne valeur de r (le résultat du rand()) par 10.

    Donc pour tout k entier naturel:
    (10 * k + 0) % 10 == 0
    (10 * k + 1) % 10 == 1
    (10 * k + 2) % 10 == 2
    (10 * k + 3) % 10 == 3
    (10 * k + 4) % 10 == 4
    (10 * k + 5) % 10 == 5
    (10 * k + 6) % 10 == 6
    (10 * k + 7) % 10 == 7
    (10 * k + 8) % 10 == 8
    (10 * k + 9) % 10 == 9
    (10 * k + 10) % 10 == 0
    (10 * k + 11) % 10 == 1
    (10 * k + 12) % 10 == 2
    ...

    Jusqu'à l'infini

    On peut aussi dire que r%=10 garde dans r le dernier chiffre de l'entier r (en base 10).

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    r %= 10 est un raccourci pour r = r % 10
    tout comme r += 10 est un raccourci pour r = r + 10
    % est l'opérateur modulo. https://c.developpez.com/cours/berna...00000000000000
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 676
    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 676
    Points : 30 963
    Points
    30 963
    Billets dans le blog
    1
    Par défaut
    Bonjour
    2 défauts dans ton code

    srand(time(NULL)) est une fonction qui initialise le générateur aléatoire (ici initialisé via le temps système mais on pourrait utiliser n'importe quel entier fixe ce qui amènerait alors le générateur à générer toujours la même suite). Du fait de son rôle, elle n'est sensée n'être appelée qu'une fois (donc dans le main()). En la mettant dans la fonction create(), elle sera appelée à chaque fois que cette fonction sera appelée. Bon ce n'est pas la mort (pas plus que si tu écrivais i=0 50 fois avant de l'utiliser) mais il est bon que tu saches ce que fait cette fonction et comment on s'en sert.
    Accessoirement moi je m'en sers ainsi: srand(time(NULL) ^ getpid()) (sur Linux). Le temps machine est calé à la seconde et donc un même programme lancé deux fois sur la même seconde (os multitache) aurait alors la même graine. En y incluant l'identifiant processus je m'assure que cela ne peut pas arriver (sauf super malchance qu'on ne pourra jamais supprimer et qui donnerait t1^pid1 = t2^pid2)

    Il est courant de voir écrit des formules du genre rand() % b + a permettant d'obtenir un nombre aléatoire entre "a" (inclus) et "a+b" (exclu). Alors ça fonctionne mais pour celui qui cherche la perfection, cela ne fonctionne pas très bien. En effet, en mettant un modulo sur rand(), cela donne une plage assez réduite dès le départ ce qui "casse" un peu l'uniformité de l'aléatoire. Bref de cette façon les nombres ne sont pas toujours uniformément distribués.
    On peut utiliser à la place la formule rand() * b / (float)RAND_MAX + a. Le RAND_MAX c'est la valeur max que peut donner rand(). De fait, en divisant une valeur comprise entre ((0 et RAND_MAX) * b) par RAND_MAX, cela donnera le même résultat mais avec une distribution plus uniformément répartie.
    => https://nicolasj.developpez.com/articles/libc/hasard

    Et de façon plus générale, si j'ai un tableau de 10 nombres, je préfèrerai écrire une fonction qui génère un nombre aléatoire et l'appeler 10 fois (plus modulaire, demain je pourrai passer facilement à iniitialiser un tableau de 50) plutôt que d'appeler une fonction qui remplit le tableau (si demain tu passes à 50 il te faudra modifier ton code à 2 endroits). Mais je suppose que c'est un exemple "fictif" dédié plutôt à la manipulation des pointeurs...
    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]

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Merci a tous d'avoir prit le temps de me répondre . Je suis toujours surpris de votre générosité et du mal que vous vous donnez pour tout expliquer dans les détails ! Je ne comprends pas encore tout puisque je suis débutant mais apres plusieurs lecture , ca devrai le faire . Mille merci

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

Discussions similaires

  1. probleme de valeur aleatoire
    Par skwi6 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/11/2006, 12h18
  2. Réponses: 4
    Dernier message: 01/06/2006, 14h58
  3. Generer valeur aleatoir entre -0.5 et 0.5
    Par sparrow dans le forum C
    Réponses: 14
    Dernier message: 13/02/2006, 19h37
  4. Réponses: 1
    Dernier message: 22/09/2005, 15h46
  5. transfert de valeurs entre fonctions js et asp
    Par ericmart dans le forum ASP
    Réponses: 5
    Dernier message: 10/03/2005, 16h18

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