programmation en C
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

programmation en C



  1. #1
    invite445eea5c

    programmation en C


    ------

    Bonjour, je voudrais savoir comment on génère des nombres aléatoires entre 0 et un nombre par exemple 20 avec la fonction RAND_MAX OUI AVEC gsl_rng_uniform (r) . ce que je dois taper dans l'algorithme,
    merci

    -----

  2. #2
    Jack
    Modérateur

    Re : programmation en C

    RAND_MAX n'est pas une fonction, mais une constante prédéfinie. Pour générer un nombre (pseudo)aléatoire, c'est la fonction rand. Pour limiter à 20, il suffit de calculer le modulo 20 du nombre renvoyé par rand.

    Mais tout çà est très bien expliqué et facilement trouvable sur le net.

  3. #3
    invite445eea5c

    Re : programmation en C

    Ah d'accord merci

  4. #4
    invite1c6b0acc

    Re : programmation en C

    Citation Envoyé par Jack Voir le message
    RAND_MAX n'est pas une fonction, mais une constante prédéfinie. Pour générer un nombre (pseudo)aléatoire, c'est la fonction rand. Pour limiter à 20, il suffit de calculer le modulo 20 du nombre renvoyé par rand.

    Mais tout çà est très bien expliqué et facilement trouvable sur le net.
    C'est peut-être obsolète, mais certains nombres aléatoires ne sont pas très bon pour les bits de poids faible.
    J'ai lu, jadis, dans la doc de rand() sous Unix qu'ils recommendaient d'utiliser "rand() * 20. /RAND_MAX" plutôt que "rand()%20"
    Dans les deux cas, je ne vois pas ce qui te pose problème (à yuuuu, pas à Jack).

  5. A voir en vidéo sur Futura
  6. #5
    invite2d7144a7

    Re : programmation en C

    Bonjour,
    Citation Envoyé par Chanur Voir le message
    C'est peut-être obsolète, mais certains nombres aléatoires ne sont pas très bon pour les bits de poids faible.
    J'ai lu, jadis, dans la doc de rand() sous Unix qu'ils recommendaient d'utiliser "rand() * 20. /RAND_MAX" plutôt que "rand()%20"
    Dans les deux cas, je ne vois pas ce qui te pose problème (à yuuuu, pas à Jack).
    Oui, et ça tient toujours.

    Mais ça dépend de l'usage des nombres générés : si c'est plus ou moins "pour voir" ou "pour s"amuser" ou "pas critique", on peut s'en contenter.

    La solution rand() * 20. /RAND_MAX restant préférable quand même.

  7. #6
    Dlzlogic

    Re : programmation en C

    Bonjour,
    Ce sujet est un bonne occasion de tester le générateur que l'on utilise.
    J'ai fait ce test, et avec mon générateur (Borland sous Windows), je n'ai pas trouvé de différence significative.
    Ce serait intéressant de faire le même test avec d'autres générateurs, ou pourquoi pas appliquer les termes constants dans un autre environnement.
    Le critère que j'utilise est le rapport EMQ/EMA = sqrt(pi/2) ~ 1.253

  8. #7
    invite8a1b1525

    Re : programmation en C

    Citation Envoyé par whoami Voir le message
    La solution rand() * 20. /RAND_MAX restant préférable quand même.
    bonsoir
    En effet, cette manière de générer un entier << partie entière de 20. * rand() / rand_max >> est préférable, simplement parce la méthode << rand() modulo 20 >> ne donne pas à coup sûr une répartition uniforme sur les entiers 0,1,...,19.
    En effet, rand_max n'est pas forcément un multiple de 20 donc, avec la formule << rand() modulo 20 >>, les nombres les plus petits 0,1,..., auront une probabilité de sortie un poil plus élevée que les nombres 19,18,...
    Pour le comprendre, faites comme si rand_max valait 50.

  9. #8
    Dlzlogic

    Re : programmation en C

    Bien-sûr, les discussions à propos de générateurs de nombres aléatoires ont toujours été une mine de contradictions.
    Tant que l'on n'aura pas défini un protocole de vérification, toutes les hypothèses contradictoires sont possibles.
    Je ne suis pas sûr que ces contradictions systématiques aident ceux qui essayent de s'y retrouver.

  10. #9
    invite8a1b1525

    Re : programmation en C

    Citation Envoyé par Dlzlogic Voir le message
    Tant que l'on n'aura pas défini un protocole de vérification,
    as-tu réalisé l'expérience que j'ai mentionnée ? Je ne pense pas, donc je répète ... :

    Considère un nombre N tiré au hasard entre 0 et 50 , avec une probabilité identique pour chaque valeur possible (à savoir proba = 1/51).
    Ensuite, calcule M = N modulo 20. Cet entier M est un entier compris entre 0 et 19.
    Quelle est la probabilité d'avoir M = 0 ? celle d'avoir M = 19 ? tu constateras facilement que ce n'est pas la même.

    Cette preuve mathématique fonctionne à l'identique pour une valeur rand_max plus grande que 50.

    Il n'y a pas de contradiction, juste une preuve mathématique du phénomène banal que la méthode << rand() modulo 20 >> ne donne pas à coup sûr une répartition uniforme sur les entiers 0,1,...,19.

  11. #10
    Dlzlogic

    Re : programmation en C

    La démonstration est pertinente. C'est peut-être pour éviter ce genre de contradiction stérile que bon nombre de logiciels produisent un nombre entre 0 et 1.

  12. #11
    invite8a1b1525

    Re : programmation en C

    Merci de souligner que l'argument n'est pas stérile puisque << bon nombre de générateurs produisent des nombres entre 0 et 1 >> afin d'éviter le problème de non uniformité évoqué ci-dessus.

Discussions similaires

  1. Programmation du jeu de la vie
    Par invite94ff2a1e dans le forum Programmation et langages, Algorithmique
    Réponses: 13
    Dernier message: 20/04/2016, 09h58
  2. quelle est la difference entre programmation procedurale et la programmation orientee objet
    Par invite430abc62 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 27/01/2016, 13h34
  3. programmation JAL
    Par invite9f536454 dans le forum Électronique
    Réponses: 0
    Dernier message: 29/04/2013, 13h21
  4. programmation TI 84 plus
    Par invite9f855684 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 16/04/2008, 16h45
  5. Programmation En Pic
    Par invite436dc8ee dans le forum Électronique
    Réponses: 7
    Dernier message: 18/05/2006, 09h42