Tirage aléatoire de dés [Résolu]

figolu94 61 Messages postés dimanche 3 décembre 2006Date d'inscription 21 juillet 2010 Dernière intervention - 3 déc. 2006 à 14:40 - Dernière réponse : cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention
- 4 déc. 2006 à 12:32
   Bonjour tout le monde et tout d'abord bravo pour ce site.

   Je dois faire un programme  où on souhaite simuler N tirages simultanés de deux dés et relever pour chaque tirage la somme des dés et j'ai malheureusement des difficultés à y parvenir.

   L'objectif est de simuler N lancés (10,100,1000 ou 10000) de deux dés, de calculer le nombre d'occurences de chaque sommes (nb de fois où on obtient 2,3,...,12) et de représenter ces occurences sur un histogramme.

   J'ai malheureusement du mal pour faire ce programme :( .Je ne sais pas comment m'y prendre pour effectuer deux tirages aléatoires simultaner de dés et aussi comment afficher les résultats obtenus dans un histogramme.

   J'aimerais un peu d'aide et des explications de votre part si celà ne vous dérange pas et je vous remercie d'avance.

Bonne continuation à tous ^^

Ps: J'ai essayé de rechercher des sujets similaires mais malheureusement celà ne m'a pas permis d'avancer dans mon problème
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 3 déc. 2006 à 17:44
3
Merci
Euh
Là je m'excuse mais c'est totalement hors sujet
Je vois pas pourquoi on ne mettrai pas de doublon dans le lancement de dés
Un dé ça reste un dé...

int des1 = (rand() % 6) + 1;   //Chiffres en 1 et 6
int des2 = (rand() % 6) + 1;   //Pareil

tabOfOccurrence[des1 + des2 - 2]++;

répéter cette opération autant de fois que tu veux lancer les 2 dés.
Biensur ne pas oublier d'initialiser tabOfOccurrence à 0. ( c'est un tableau de 11 entier parce que les sommes possibles sont 2, 3, 4, ..., 11, 12

Ensuite en ce qui concerne l'histogramme, si t'arrive pas à simuler un lancer de dés, j'pense qu'il est pas convenable d'y songer pour l'instant.

La seule chose dont tu peux être sur, c'est qu'il aura toujours la même forme pour un nombre de lancé très grand.                             *       *
                                                      *       *  
                                             *       *       *       *
                                             *       *       *       *
                                     *      *       *       *       *        
                                     *      *       *       *       *         *   
                             *      *      *       *       *       *         *      
                     *      *      *      *       *       *       *         *       *
             *      *      *      *      *       *       *       *         *       *         *
             2      3      4      5      6       7       8        9       10     11       12
ULARGE_INTEGERJokyQi=QI("Joky"

Merci cs_Joky 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_Joky
figolu94 61 Messages postés dimanche 3 décembre 2006Date d'inscription 21 juillet 2010 Dernière intervention - 3 déc. 2006 à 14:43
0
Merci
J'ai oublié de préciser que ces dés sont des dés à 6 faces donc le tirage aléatoire pour un dés ne pourra comporter que des valeurs de 1 à 6
Commenter la réponse de figolu94
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 3 déc. 2006 à 15:32
0
Merci
Pour ce qui concerne les histogrammes, vu que peu d'exemple était sur ce site, tu peux t'inspirer d'une classe que j'ai faite, voir :
http://www.cppfrance.com/codes/GRAPHIQUE-BARRES-PARAMETRABLE-FIXE-OU-ANIME_40208.aspx

Pour le tirage aléatoire, un petit algo suffit :

//
// RandomArray()
// Donne une suite aléatoire sans doublon de 0 à borneSup-1
// en remplissant le tableau donné  
//


void RandomArray(unsigned* pTab, unsigned borneSup)
{
   bool bSameNum;


   for(unsigned i=0; i<borneSup; i++)
   {
        bSameNum = true;


        while( bSameNum )
        {
            pTab[i] = rand() % borneSup;
            bSameNum = false;


            for(unsigned j=0; j<i; j++)
            {
                if( pTab[j] == pTab[i] )
                {
                    bSameNum = true;
                    break;
                }
            }
        }
    }
}
Commenter la réponse de yann_lo_san
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 3 déc. 2006 à 15:39
0
Merci
Précision : a toi d'adapter ce code, si tu appelle une fois cette fonction avec 6 en borne sup, tu auras un tab d'une suite de 0 à 5 aléatoire
(par ex 2 , 0 , 1 , 4 , 5 , 3) cela te donne déjà 6 tirages pour un dé.
Commenter la réponse de yann_lo_san
figolu94 61 Messages postés dimanche 3 décembre 2006Date d'inscription 21 juillet 2010 Dernière intervention - 3 déc. 2006 à 16:42
0
Merci
Ok je prend note de tout ça et je te remercie beaucoup de m'avoir aider, je vais oir ce que je peux faire avec tes informations ^^.
   Encore Merci ^^
Commenter la réponse de figolu94
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 3 déc. 2006 à 18:49
0
Merci
Salut:

Je ne vois pas la fonction "srand" pour initialiser le générateur les nombres pseudo-aléatoires:

#include <time.h>
// ...

srand ((unsigned) time (NULL));

// ...
Commenter la réponse de Ombitious_Developper
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 3 déc. 2006 à 21:30
0
Merci
C'était juste pour montrer comment obtenir des suites aléatoires, les doublons sont bien sur possibles avec des dés. Mais il est vrai que si tu as des difficultés avec un
tirage = (rand()%6)+1;
Il faut que tu commences par le début, un bon tuto en C...
Commenter la réponse de yann_lo_san
figolu94 61 Messages postés dimanche 3 décembre 2006Date d'inscription 21 juillet 2010 Dernière intervention - 3 déc. 2006 à 21:41
0
Merci
   Merci Joky pour le message c'est vrai que c'est pas mal comment tu expliques et ouais pour l'histogramme je devrais obtenir une forme similaire. J'ai juste pas trop compris  "des1 + des2 -2", pourquoi on a un "-2" à la fin et aussi le "++" à la fin, après les crochet.


   J'aimerais quelques précisions stp, encore Merci ^^
Commenter la réponse de figolu94
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 4 déc. 2006 à 11:31
0
Merci
Oui et j'ai aussi oublier de déclarer mon tableau tabOfOccurrence :D
Non mais si on joue à ça on a pas fini lol, donc je laisser le srand aux soins du programmeur :)

Et sinon ptite explication

int tabOfOccurence[11] = {0,0,0,0,0,0,0,0,0,0,0};

des1 aura sa valeur comprise entre 1 et 6
des2 aura sa valeur comprise entre 1 et 6
des1 + des2 aura sa valeur comprise entre 2 et 12 ( Vu que tu veux étudier la somme )

un tableau étant indéxé à partir de 0 en C, on retire 2 à la somme...
Donc la case 0, représentera la valeur 2,
         la case 1,                     la valeur 3,
............................................................
         la case i,                       la valeur i+2
et      la case 10,                   la valeur 12
En ce qui concerne l'opérateur ++, c'est un opérateur de post incrémentation (je sais pas si on peut le dire comme ça) donc il est équivalent à i +1 <-> i i + 1 <-> i++

Et donc il faut savoir faire la différence entre ++i et i++;

Exemple :
int a;
int i = 5;

a = i++;         //a vaut 5 puis on incrémente i;   i vaut 6 maintenant
a = ++i;         //on incrémente i ( i vaut 7) et on l'affecte à a, d' où a vaut 7

Donc pour finir tu auras ton tableau d'occurrence directement sans aucun effort on peut dire...

ULARGE_INTEGERJokyQi=QI("Joky"
Commenter la réponse de cs_Joky
cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention - 4 déc. 2006 à 12:32
0
Merci
#include <stdio.h>
#include <stdlib.h>
#include <time.h>



#define N 300
#define R ((rand() % 6) + 1)



int main(void)
{
  int i, j, t[11] = {0};
 
  srand(time(NULL));



  for(i = 0; i < N; i++)
    t[R + R - 2]++;



  for(i = 0; i < 11; i++)
  {
    printf("\n%2d ", i + 2);
    for(j = 0; j < t[i]; j++)
      printf("*");
     
    printf(" %d (%d%%)", t[i], (t[i] * 100) / N);
  } 
  printf("\n");      
  return 0;
}



Qui peut donner comme resultat:

 2 ********* 9 (3%)
 3 **************** 16 (5%)
 4 ****************** 18 (6%)
 5 ***************************** 29 (9%)
 6 ************************************ 36 (12%)
 7 ************************************************ 48 (16%)
 8 ******************************************** 44 (14%)
 9 ***************************************** 41 (13%)
10 ************************** 26 (8%)
11 *********************** 23 (7%)
12 ********** 10 (3%)
Commenter la réponse de cs_magma

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.