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

R Discussion :

lancer de deux dés


Sujet :

R

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut lancer de deux dés
    Bonjour,
    On considère un lancer de deux dés nommés : a, b. Calculer la probabilités de p(a=b)

    J'ai utilisé dice(rolls = 2 ,ndice=2).
    Je sais qu'il faut utiliser une loi uniforme discrète, punif.
    Après, je ne sais pas comment faire en sorte de n'avoir que les probabilités de a=b.

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    On te demande de calculer les probabilités que a=b.

    Donc si on prend deux dés à 6 facettes, on a 6 valeurs possibles pour chacun des dés.

    Il suffit ensuite de générer tous les couple possibles, éliminer les doublons, puis voir pour combien de cas on a a=b.
    Ensuite, tu fais une proportionalité sur le nombre de cas (a=b) / nombre total de cas. Et tu as ta réponse .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    J'étais motivé et m'ennuyais un peu donc j'ai fait un petit programme qui calcule cette probabilité .
    Bien sur ce programme ne devrait pas trop compiler lorsque tu le lances, c'est pour que tu aies une idée de ce qu'il faut faire.
    De plus, j'utilise des concepts avancés de prog que tu n'as pas vus normalement, donc évite de le recopier tel quel pour le rendre à ton prof, tu te feras griller directement .

    test2.cpp

    Code c++ : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    struct coupleValeur
    {
    	int a;
    	int b;
    	struct coupleValeur* next;
    	struct coupleValeur* prev;
    };
     
    void supprimeDoublon(struct coupleValeur* first)
    {
    	struct coupleValeur *liste = first;
    	while (liste)
    	{
    		struct coupleValeur* it = liste->next;
    		while (it)
    		{
    			if (it->a == liste->b && it->b == liste->a && it->a != it->b)
    			{
    				if (it->prev)
    				{
    					it->prev->next = it->next;
    					it->next->prev = it->prev;
    				}
    			}
    			it = it->next;
    		}
    		liste = liste->next;
    	}
    }
     
    void afficherListe(struct coupleValeur* liste)
    {
    	while (liste)
    	{
    		std::cout << liste->a << "/" << liste->b << std::endl;
    		liste = liste->next;
    	}
    }
     
    int countEgal(struct coupleValeur* liste)
    {
    	int ret = 0;
    	while (liste)
    	{
    		if (liste->a == liste->b)
    			ret++;
    		liste = liste->next;
    	}
    	return ret;
    }
     
    int count(struct coupleValeur* liste)
    {
    	int ret = 0;
    	while (liste)
    	{
    		ret++;
    		liste = liste->next;
    	}
    	return ret;
    }
     
    int main(int argc, char* argv[])
    {
    	int valMax = 1;
    	int* valeur;
    	valeur = new int[valMax];
    	int i = 0;
    	while (i < valMax)
    	{
    		valeur[i]=++i;
    	}
    	struct coupleValeur *listeValeur = 0;
    	struct coupleValeur* current = 0;
    	int ia = 0;
    	int ib = 0;
    	while (ia < valMax)
    	{
    		ib = 0;
    		while (ib < valMax)
    		{
    			struct coupleValeur *elem = new coupleValeur;
    			elem->next = 0;
    			elem->prev = current;
    			elem->a = valeur[ia];
    			elem->b = valeur[ib];
    			if (current == 0)
    			{
    				listeValeur = elem;
    				current = elem;
    			}
    			else
    			{
    				current->next = elem;
    				current = current->next;
    			}
    			ib++;
    		}
    		ia++;
    	}
    	supprimeDoublon(listeValeur);
    	//afficherListe(listeValeur);
    	int nbEgal = countEgal(listeValeur);
    	int nb = count(listeValeur);
    	std::cout << "probabilite que a == b est de " << (nbEgal*100)/nb << "%" << std::endl;
    	system("PAUSE");
    	return 0;
    }

    Par contre, tu peux utiliser ce programme pour vérifier que tu obtiens bien le même résultat et comparer ta suppression de doublon à la mienne afin de comprendre les principes de programmation que ton prof veut te faire apprendre au travers de cet exercice.

    PS: J'étais curieux de voir les résultat sur les stats, je pensais que plus le dé pouvait prendre de valeurs, plus on avait de chances de faire un double. Et bah non Oo en fait c'est l'inverse .

    EDIT: oups, je pensais que c'était dans la section C, me suis complètement planté sur ce coup là ^^. Tout étant que tu peux quand même utiliser ce programme pour vérifier les données ou comprendre le mécanisme ^^.
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Comment puis-je générer tous les cas possibles ?

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Pour générer tous les cas possibles, j'ai utilisé ça : plot.dice ( expand.grid(1:6,1:6),layout=c(6,6) )Pour les cas :
    - a=b : ce sont tous les cas qui sont sur la diagonale p(a=b) = 6/36
    - a<b : tous les cas en-dessous de la diagonale p(a<b) = 15/36
    - a>b : tous les cas au-dessus de la diagonale p(a>b) = 15/36
    Mais après, je ne sais pas comment retrouver ces résultats avec une commande.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    d=expand.grid(1:6,1:6)
    sum(d[1]-d[2] == 0) / length(d[1])
    Avec la fonction sum j'utilise le fait que R convertisse automatiquement les booléens en nombres (TRUE = 1, FALSE = 0).

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Hello,

    Déjà le résultat c'est 1 sur le nombre de faces du dé, ça parait logique ^^"

    Ensuite pour le retrouver empiriquement avec R :

    Methode 1- Tu fais comme propose Theta en dénombrant tous les cas possibles.
    Par contre attention il y a une petite erreur dans le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <div class="cms_table"><table class="cms_table"><tr valign="top" class="cms_table_tr"><TD class="cms_table_td">d=expand.grid(1:6,1:6)
    sum(d[,1]-d[,2] == 0) / length(d[,1])</TD>
    </tr>
    </table></div>
    Méthode 2- En simulant la réalisation des lancers de dé : tu veux utiliser la loi uniforme si j'ai bien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <div class="cms_table"><table class="cms_table"><tr valign="top" class="cms_table_tr"><TD class="cms_table_td">#je simule 100 000 lancers de paires de dés (la j'ai transformé la loi uniforme pour qu'elle prenne des valeurs discretes de 1 à 6 avec floor). 
    #puis je dénombre dans combien de cas le dé 1 = le dé 2 grace au table
     
    table(floor(runif(100000,1,6.99999))==floor(runif(100000,1,6.99999)))/100000
    #je retombe bien sur un sixième</TD>
    </tr>
    </table></div>

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Bonjour,
    Quelle est la différence entre d[1] et d[,1] ?
    Quand je tape d[1], àa m'affiche les résultats en colonne et d[,1] en ligne. Mais ça ne change rien au calcul quand j’enlève la virgule.

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    d[1] renvoie la première colonne de d sous forme de dataframe, d[[1]] ou d[,1] renvoient la première colonne sous forme d'un vecteur (d'integer ici).

    Dans pas mal de cas ça ne change rien, car R convertit automatiquement les variables dans le type le mieux adapté.
    Mais dans d'autres cas, ne pas avoir le bon type de variable entraine des erreurs ou des résultats inattendus. Par exemple length, appliqué à un dataframe renvoie le nombre de colonnes (soit 1 pour d[1]), alors qu'appliquée à un vecteur, elle renvoie le nombre de valeurs (soit 36 pour d[,1]).

    Tu veux voir la classe d'un objet avec la fonction "class", c'est souvent utile pour déboguer un code, surtout vu que R n'est pas toujours hyper logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    > class(d[,1])
    [1] "integer"
    > class(d[,c(1,2)])
    [1] "data.frame"
    > class(d[,NULL])
    [1] "data.frame"

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    ok, merci de vos aides

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

Discussions similaires

  1. [Sessions / htaccess] Lancer les deux
    Par newbiemac dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2007, 00h13
  2. lancer deux fonctions en même temps
    Par youp_db dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/09/2006, 12h11
  3. Lancer deux programmes d'installation un après l'autre
    Par annedeblois dans le forum Windows
    Réponses: 21
    Dernier message: 01/08/2006, 21h04
  4. Réponses: 3
    Dernier message: 11/01/2006, 15h39
  5. Lancer deux sons en même temps...
    Par Julien_riquelme dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 03/05/2003, 17h00

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