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
    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
    Je viens de comprendre ! le " r%=10" renvoie une valeur aleatoire contenue entre 1 et 10 .

  3. #3
    Membre du Club
    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

    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
    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/arti...es/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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  6. #6
    Nouveau membre du Club
    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

###raw>template_hook.ano_emploi###