Dépiper un dé pipé

Bonjour

On se méfie d'un dé à six faces, qu'on soupçonne d'être fortement pipé.
On note $X$ la loi du dé : $\forall\,k\in\llbracket 1,6\rrbracket,\;\mathbb{P}(X=k)>0$.
On lance le dé jusqu'à obtenir six résultats successifs différents, et on ne retient de tout cela que le résultat du dernier lancé.
On est d'accord qu'on a ainsi rendu le dé honnête?
Deuxième question: quelle est l'espérance du temps d'attente de cette première succession de six résultats différents?

Réponses

  • gerard0
    Modifié (April 2022)
    Bonjour. 
    On n'a pas changé le dé, on ne l'a pas rendu honnête. 
    Mais le tirage non plus : les numéros les plus probables ayant tendance à sortir les premiers seront rarement les sixièmes. 
    Cordialement. 
  • Dom
    Dom
    Modifié (April 2022)
    Vais-je savoir faire ça ?
    Trouver la loi de la dernière face d’une série de six faces distinctes consécutives. 
    Comme les lancers sont indépendants, je m’interroge…
    Par contre, si une face ne sort jamais ($p_i=0$ pour au moins un $i$ ce n’est pas dans les hypothèses) alors on ne joue pas avec ce dé. 

    Édit : essayons avec une pièce où on a la probabilité $p$ pour Pile et $q$ pour Face. 
    On souhaite connaître la loi de Pile/Face lorsque l’on jette la pièce et qu’on regarde Pile alors qu’avant on n’a eu que des Faces (et vice versa). 
  • Dom
    Dom
    Modifié (April 2022)
    Si je ne me trompe pas, j’ai échangé $p$ et $q$, non ? 😀
  • Oui ça marche jmf, à condition de recommencer une nouvelle série depuis rien après chaque échec (tirer une face déjà sortie dans la série).
  • Guego
    Modifié (April 2022)
    Tel que je le comprends, ça ne marche pas.
    import numpy.random as nr
    rng=nr.default_rng()

    # Simule un dé pipé qui tombe sur 1 avec une proba 1/20, 2 avec une proba 1/20
    # 3 avec une proba 2/20, 4 avec une proba 3/20, 5 avec une proba 4/20
    # et 6 avec une proba 9/20

    def de():
        a=rng.integers(20)
        if a==0:
            return 1
        elif a==1:
            return 2
        elif a==2 or a==3:
            return 3
        elif a==4 or a==5 or a==6:
            return 4
        elif a==7 or a==8 or a==9 or a==10:
            return 5
        else:
            return 6

    # Simule les lancers jusqu'à en avoir 6 successifs différents, et renvoie le dernier

    def T():
        (x,y,z,u,v,w)=(de(),de(),de(),de(),de(),de())
        while len(set([x,y,z,u,v,w]))<6:
            (x,y,z,u,v,w)=(y,z,u,v,w,de())
        return w
    Sur 6000 appels de T, le nombre de 1,2,...,6 obtenus est : 1170, 1230, 1010, 1051, 948, 591. Ça ne m'a pas l'air très uniforme.
    Edit : la balise code n'a pas l'air de marcher. Si un modérateur passe par là...
  • Il faut recommencer dès que ça foire, Guego.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Recommencer quoi dès que quoi foire ?
  • Dom
    Dom
    Modifié (April 2022)
    Je ne comprends pas ce que vous dites : pourquoi « recommencer » ? Ou plutôt n’est-ce pas déjà écrit dans l’énoncé ?
    Si j’ai bien compris : on jette le dé jusqu’au avoir 123456 ou 524316 ou 256413 par exemple (avec interdiction d’avoir une telle série avant car on se serait alors arrêté). 
  • nicolas.patrois
    Modifié (April 2022)
    Dès qu’une occurrence apparaît en double.
    #!/usr/bin/python3

    from random import choice

    dé=(1,2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,6,6,6,6)

    compte={1:0,2:0,3:0,4:0,5:0,6:0}
    for _ in range(10000):
    while True:
    lancers=[]
    while True:
    d=choice(dé)
    if d not in lancers:
    lancers.append(d)
    if len(lancers)==6:
    break
    else:
    break
    if len(set(lancers))==6:
    compte[d]+=1
    break
    print(compte)
    Sortie :
    > ./dépipé.py 
    {1: 1619, 2: 1652, 3: 1651, 4: 1688, 5: 1693, 6: 1697}
    Ça ressemble plus à une loi uniforme.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Guego
    Modifié (April 2022)
    Dès qu’une occurrence apparaît en double.

    C'est bien ce que je fais : si je n'ai pas 6 résultats différents, je refais un lancer. Ce que tu dis est qu'il faut refaire 6 lancers, c'est-à-dire ne travailler qu'avec des paquets des 6 qui ne se chevauchent pas ?

    Si oui, ça n'était pas très clair dans le message initial.

  • Imaginons la séquence 1233456123

    1233 : Ah doublon, on efface tout.  Ou encore, on ajoute un point après ce 3 : 1233.456123 
    Et donc 3.45612 n'est pas une séquence valide.
    Mais 456123 est une séquence valide.
    Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin
  • Ha…
    par exemple si « xxxxx123456 » est sortie (et donne 6, donc) alors on interdit d’avoir 6 avec un autre « xxxx123456 » mais on l’accepte avec par exemple « xxx432156 », c’est ça ?
  • marco
    Modifié (April 2022)
    Si il y a seulement deux faces avec probabilité $p$ pour la face $1$, $(1-p)$ pour la face $2$.
    Alors la probabilité du tirage $112$ est $p^2(1-p)$
    Celle du tirage $221$ est $(1-p)^2p$, donc c'est différent si $p \neq 1/2,0$ ou $1$.
    Mais si on recommence dès que l'on a deux fois la même face, alors la probabilité de $12$ est $p(1-p)$ et celle de $21$ est $(1-p)p$, donc c'est la même probabilité.
  • @Guego @Lourran

    Il ne s'agit pas de procéder à des paquets de 6 lancés successifs (sinon le succès n'apparaîtrait qu'au bout de 6n lancers). Ce que j'attends c'est d'observer 6 lancés successifs distincts (par exemple 1,1,2,3,4,5,6 et là on s'arrête au 7ème lancé, et on garde le résultat "6").
  • raoul.S
    Modifié (April 2022)
    @Jmf je crois plutôt qu'il faut procéder comme ont dit nicolas.patrois et marco autrement ton dé reste pipé. Regarde ce qu'il se passe avec l'exemple plus simple de marco, tu verras que ça ne marche pas si tu attends 2 lancés successifs distincts.

    Pour revenir à ton cas ce qu'il faut faire c'est supprimer l'issue si on a un doublon. Par exemple 1,2,3,2 je m'arrête car doublon. Mais 1,2,6,4,5,3 c'est bon. Là ce n'est plus pipé.

    En ce qui concerne la deuxième question, étant donné que la probabilité d'obtenir une séquence de 6 résultats distincts est $6! \prod_{k=1}^6 P(X=k)$ on peut poser $p:=6! \prod_{k=1}^6 P(X=k)$ et le temps d'attente suit une loi géométrique de paramètre $p$ dont l'espérance est $1/p$.
  • Pour dépiper un dé on fait une course: On prend 6 copies du même dé (ce qui revient à faire des listes de 6 lancers consécutifs du même dé).
    On regarde la première liste où l'un des dés tombe sur un as mais pas les autres. Le numéro du dé en question est alors le numéro du tirage. On peut ensuite recommencer (on suppose tout de même que la probabilité de tirer un as n'est pas nulle, sinon on prend une autre face).
    Une fonction est un ensemble $f$ de couples tel que pour tous $x,y,z$, si $(x,y)\in f$ et $(x,z)\in f$ alors $y = z$.
  • Pour le dé avec deux faces, j’ai démontré qu’en effet on obtient pas 1/2 pour chaque. On a même échange des probabilités de chaque face. 
  • Pomme de terre
    Modifié (April 2022)
    @jmf : ça ne fonctionnera pas de cette manière, comme l'expliquait gerard0. Imagine que ton dé donne $1$ avec proba $1-\epsilon$ et toute autre valeur avec proba $\frac1{5\epsilon}$. Lorsque $\epsilon \to 0$, tous les échecs seront provoqués par un double 1 avec très grande probabilité. La probabilité de finir la première série de $6$ valeurs distinctes avec $1$ sera donc négligeable. Il faut repartir de zéro après un échec pour éviter ce problème, comme sur l'exemple de lourran.

  • Ha ! Le temps de poster et je ne fais pas gaffe aux messages tombés entre temps. 
    En effet, je viens de voir le message de Lourrran. 
    Si on 132454, on arrête tout et on recommence ?

    remarque : si on accepte la règle du jeu de départ (qui ne normalise pas le dé), a-t-on un moyen simple de connaître la loi du tirage ? (Des matrices là-dedans ?)
  • La méthode de jmf ne convient pas, c'est certain. 
    La méthode rectifiée selon les directives de Nicolas.Patrois convient-elle ?
    Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin
  • Pomme de terre
    Modifié (April 2022)
    Notons $q_k = k! \sum\limits_{1 \leq i_1 < \dots < i_k \leq 6} p(i_1)\dots p(i_k)$ la probabilité d'avoir $(X_1,\dots,X_k)$ distincts.
    La probabilité de réussir une série de $6$ valeurs distinctes est $q_6$, donc :
    • le nombre de séries ratées aura pour espérance $\frac1{q_6}-1$ (loi géométrique) ;
    • la longueur moyenne d'une série ratée est $\frac1{1-q_6}\sum_{k=2}^6 k(q_{k-1} - q_k)$.
    L'espérance du nombre total de lancers avec la méthode de jmf corrigée sera donc : $$6 + \frac{1}{q_6}\sum_{k=2}^6 k(q_{k-1}-q_k).$$
  • Pomme de terre
    Modifié (April 2022)
    @lourrran : pour la méthode de jmf corrigée, les séries sont indépendantes donc ça revient à calculer $$\pi_k = P\left(X_6 = k \mid X_1,\dots,X_6 \text{ sont distincts}\right).$$
    Faisons-le pour $k = 6$, les autres cas étant symétriques : $$\pi_6 = \frac{\sum_{\sigma \in \mathfrak S_5} p\big(\sigma(1)\big)\cdots p\big(\sigma(5)\big)p(6)}{\sum_{\sigma \in \mathfrak S_6} p\big(\sigma(1)\big)\cdots p\big(\sigma(6)\big)} = \frac{5!\, p(1)\cdots p(6)}{6!\, p(1)\cdots p(6)} = \frac16.$$
  • jmf
    jmf
    Modifié (April 2022)
    ok ok, la méthode initiale (disons méthode 0) de dépipage ne fonctionne pas, et ça se voit très bien avec le cas d'une pièce comme l'on fait remarquer plusieurs personnes. Je me suis enduit d'erreur tout seul.
    Méthode 1:  on effectue six lancés, puis six autres, puis six autres, jusqu'à voir apparaître 6 lancés différents. Et on retient le tout dernier résultat. et là le numéro tiré suit une loi uniforme?
    Méthode 2: on attend de voir apparaître six lancés différents, sachant qu'on recommence à zéro si on tombe sur un numéro déjà sorti.

    méthode 0 : $\fbox{1,2,3}$, $\fbox{5,1,6,2,3,4}$ : 9 lancés, résultat retenu 4
    méthode 1 : $\fbox{1,2,3,5,1,6}$ $\fbox{1,2,3,4,5,6}$  : 12 lancés, résultat retenu 6
    méthode 2 : $\fbox{1,2,3,5,1}$ $\fbox{6,1,2,3,4,5}$   :  11 lancés, résultat retenu 5
  • merci  @lourran @Pomme de terre et les autres

    @lourran ce que tu appelles "méthode de jmf corrigée" c'est bien la méthode 2 ci-dessus?
  • Oui, la méthode 2.
    La méthode 1 me paraît bonne, et plus facile à prouver que la 2.
    Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. Benjamin Franklin
  • nicolas.patrois
    Modifié (April 2022)
    En tout cas, il faut presque deux fois plus de lancers dans le cas 2 :
    #!/usr/bin/python3
    
    from random import choice
    
    dé=(1,2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,6,6,6,6)
    
    compte={1:0,2:0,3:0,4:0,5:0,6:0}
    l=0
    n=10000
    for _ in range(n):
      while True:
        lancers=[]
        while True:
          d=choice(dé)
          l+=1
          if d not in lancers:
            lancers.append(d)
            if len(lancers)==6:
              break
          else:
            break
        if len(set(lancers))==6:
          compte[d]+=1
          break
    print("cas 1")
    print(l,n,compte)
    
    compte={1:0,2:0,3:0,4:0,5:0,6:0}
    l=0
    for _ in range(n):
      while True:
        lancers=[choice(dé) for _ in range(6)]
        l+=6
        if len(set(lancers))==6:
          compte[lancers[-1]]+=1
          break
    print("cas 2")
    print(l,n,compte)
    
    Le résultat :
    cas 1
    13092378 10000 {1: 1585, 2: 1679, 3: 1698, 4: 1684, 5: 1685, 6: 1669}
    cas 2
    24330906 10000 {1: 1648, 2: 1695, 3: 1662, 4: 1709, 5: 1600, 6: 1686}
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • jmf
    jmf
    Modifié (April 2022)
    @nicolas.patrois

    Ton cas 1 correspond à ce que j'ai appelé "méthode 2" (recommencer à zéro si lancé est en doublon) et ton cas 2 à la méthode 1(blocs de 6 lancés successifs)
  • Zgrb
    Modifié (April 2022)
    
    #R-4.1.3
    
    p0<-function(p,n){l<-c(0,0,0,0,0,0);i<-0;p<-p/sum(p);p<-cumsum(p)
    while(i<n){i<-i+1;m<-c()
    while(length(m)<6 || length(unique(m[(length(m)-5):length(m)]))<6){a<-runif(1);m<-c(m,1+sum(a>p))}
    a<-m[length(m)];l[a]<-l[a]+1}
    return(l)}
    
    p1<-function(p,n){l<-c(0,0,0,0,0,0);i<-0;p<-p/sum(p);p<-cumsum(p)
    while(i<n){i<-i+1;k<-0
    while(k<1){m<-runif(6,0,1);mm<-c()
    for(j in 1:6){mm<-c(mm,1+sum(m[j]>p))}
    if(length(unique(mm))==6){k<-mm[6]}}
    l[k]<-l[k]+1}
    return(l)}
    
    p2<-function(p,n){l<-c(0,0,0,0,0,0);i<-0;p<-p/sum(p);p<-cumsum(p)
    while(i<n){i<-i+1;m<-c()
    while(length(m)<6){a<-runif(1);m<-c(m,1+sum(a>p))
    if(length(unique(m))<length(m)){m<-c()}}
    a<-m[6];l[a]<-l[a]+1}
    return(l)}
    
    > p<-c(1,2,10,3,7,6)
    > p0(p,60000)
    [1] 11919 11591  7478 10779  8921  9312
    > p1(p,60000)
    [1] 10060  9927  9891  9924 10081 10117
    > p2(p,60000)
    [1]  9961  9981 10020  9954  9983 10101
    Effectivement, les méthodes 1 et 2 semblent fonctionner

    Edit : Je précise effectivement que p2 semble effectuer environ 45% de lancers de dés en moins que p1, avec les poids que j'ai choisi.
    Si je modifie les poids avec une face "très lourde" (ex : p<-c(1,2,50,3,7,6) ), j'obtiens même 56% de lancers en moins.
    A voir avec des poids encore plus lourds !
  • pldx1
    Modifié (April 2022)
    Bonjour, 
    $\def\esp#1{\mathrm{E}\left(#1\right)}$ Jusqu'à maintenant, personne n'a ne serait-ce qu'évoqué les beaux Réliens, les $\Omega$ et autres magnifiques choses qui sont infligées aux étudiants dès que l'on évoque les probas-stats. Seraient-ils à ce point inutiles ?
    Le coeur de l'affaire, c'est la notion d'indépendance et donc la description des points de renouvellement du processus. De ce point de vue, les deux processus " 1" et " 2" sont absolument identiques. En fait, ils ne se distinguent que par des détails de programmation. Lorsque l'on procède à un bloc de six lancers successifs et que, au k-ième lancer on constate une collision avec les résultats déjà obtenus, on a le choix entre faire effectivement les 6-k lancers restants (qui ne changeront rien au fait qu'une collision a déjà eu lieu), ou ne pas les faire mais les compter quand même dans $L_{1}$, ou bien ne pas les compter dans $L_{2}$ (qu'on les fasse ou non). Cela donne, comme déjà dit par  @Pomme_de_terre (msg-2352927)
    \[ \esp{L_{1}}=N\times\frac{6}{q_{6}}\;;\;\esp{L_{2}}=N\times\left(6+\frac{1}{q_{6}}\sum_{k=2}^{6}k\left(q_{k-1}-q_{k}\right)\right) \]

    Avec les données choisies par @nicolas_patrois (msg-2352905), cela donne respectivement  \[ N\times2469.136\;;\;N\times1333.014 \] soit un " bon accord pifométrique" avec les résultats expérimentaux (2433 et 1309). On sait que l'on peut utiliser l'indicateur $\chi^{2}$ de Pearson pour tester l'accord entre les valeurs expérimentales des nombres de visites avec leurs valeurs théoriques, soit $N/6$.
    Cela donne
    add((j-N/6)\textasciicircum 2/(N/6), j=[1585, 1679, 1698, 1684, 1685, 1669]) $\mapsto5.067$
    add((j-N/6)\textasciicircum 2/(N/6), j=[1648, 1695, 1662, 1709, 1600, 1686]) $\mapsto4.670$
    Comme l'espérance du $\chi^{2}$ est $5$, et sa variance $10.002\simeq10$, les résultats sont presque " trop beaux" .
    Par comparaison la série p0(p,60000) de @Zgrb (msg-2352952) donne un $\chi^{2}$ réduit de 467... valeur horrible, en effet !
    Mais il ne faudrait pas en conclure que l'une des méthodes est $2469/1333$ fois " meilleure" que l'autre. En effet, il n'y a pas que les appels au générateur aléatoire qui ont un coût. Les structures de données utilisées (append, détection de collision, etc) ont elles aussi leur importance: il serait intéressant de comparer les durées d'exécution.  


    Cordialement, Pierre.
  • Ça vaut ce que ça vaut (pas lourd mais quand même) :
    > time ./dépipé.py 
    cas 1
    13402899 10000 {1: 1546, 2: 1683, 3: 1659, 4: 1723, 5: 1679, 6: 1710}
    
    real	0m42,990s
    user	0m34,489s
    sys	0m0,156s
    > time ./dépipé.py 
    cas 2
    24722604 10000 {1: 1593, 2: 1650, 3: 1715, 4: 1678, 5: 1722, 6: 1642}
    
    real	1m2,682s
    user	0m46,698s
    sys	0m0,282s
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • J'ai l'impression qu'il faut traduire cela par 34 secondes utiles pour l'un et 47 secondes utiles pour l'autre, ratio= 1.38. Tandis que 'real' mesure en plus ce que nicolas.patrois faisait d'autre avec son ordi (durées 43s versus 62s), soit 9 secondes versus 15 secondes (cum grano salis). 
  • Les 62 secondes réelles, c’est à cause de mon vieux tromblon.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
Connectez-vous ou Inscrivez-vous pour répondre.