Dans mon précédant billet, je regardais combien de figurines Lego je devais acheter pour avoir toute la série, avec ma fille. Pour la série de 16, il fallait, en moyenne, acheter 54 sachets, à 3 euros pièces. Dans les commentaires, @Guillaume et @Gaelle me faisaient noter que les échanges, ça pouvait aider.
Bon, tout d’abord j’aime pas qu’on donne des conseils à mes filles pour avoir raison contre moi ! Parce que oui, c’est sûr qu’en s’y mettant à plusieurs, le coût individuel sera plus faible… Ensuite, parce que les maths me semblent plus compliqués…. Cela dit, en simulant des parties, ça tombe assez vite…
Pour commencer, je fais une petite fonction (histoire d’alléger mes codes) pour incrémenter mes comptages de figurines, à chaque fois que j’en achète une
> f=function(mat,i){ + mat[i]=mat[i]+1 + return(mat) + }
Ensuite, on peut avoir une petite fonction, correspondant à une simulation, qui me renvoie le nombre de figurine de chaque type que j’ai du acheter pour avoir les 16 une fois. Ou plus. En fait, je veux avoir en tout k fois toutes les figurines (ce qui permet de partager parmi k ami(e)s)
> tirage=function(k=1){ + test=FALSE + cpte=0 + M=rep(0,16) + while(!test){ + no=sample(1:16,size=1) + M=f(M,no) + cpte=cpte+1 + if(min(M)==k) test=TRUE + } + return(list(compte=M, + nbre=cpte)) + }
Maintenant on peut faire des simulations. Par exemple, pour retrouver le fait qu’il faut, en moyenne, acheter 54 sachet pour que ma fille (seule) ait toutes les figurines
> N=unlist(lapply(1:10000,function(x) tirage(1)$nbre)) > mean(N) [1] 54.1854
Si maintenant on le fait avec mes deux filles,
> N=unlist(lapply(1:10000,function(x) tirage(2)$nbre)) > mean(N) [1] 82.7961
ce qui est (beaucoup) moins que le double. Si au lieux de faire ça entre mes deux filles, mais que ma fille collectionne les figurines avec une amie à elle (et que les papas partagent les frais), on a en moyenne 41 sachets à acheter, chacun,
> mean(N)/2 [1] 41.39805
et pour trois, on passe à 36 sachets
> N=unlist(lapply(1:10000,function(x) tirage(3)$nbre)) > mean(N)/3 [1] 36.04363
etc
> V=unlist(lapply(1:10,function(k) mean(unlist(lapply(1:10000,function(x) tirage(k)$nbre))))) > plot(1:10,V/1:10,type="b",pch=19)
On peut aller plus loin, en regardant les quantiles. Avec 4 ami(e)s, si on achète tous 45 sachets, on a 90% de chances que tout le monde ait les 16 figurines
D’ailleurs, si on regarde l’évolution du quantile (à 90%) sur la moyenne, on voit qu’il baisse vite avec la taille…. Avec 2 ami(e)s, il faut 35% de sachets en plus pour s’assurer d’avoir toutes les figurines dans 90% de cas (par rapport au nombre moyen) alors qu’il en faut juste 20% de plus avec 8 ami(e)s.
Maintenant, si quelqu’un a le courage (et le temps) de faire les maths, je suis preneur !
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (January 14, 2016). Collectionner les Figurines Lego avec ses Ami(e)s. Freakonometrics. Retrieved November 10, 2024 from https://doi.org/10.58079/ov27
Les maths ont déjà été faites :-).
Pour trouver le nombre moyen de figurines à acheter, pour avoir $m$ jeux complets de $n$ figurines chacun, la valeur exacte et une asymptotique est donnée dans https://dx.doi.org/10.2307%2F2308930 par exemple.
On obtient $n \log n + (m-1) n \log \log n + n ( \gamma – \log (m-1)! ) + o(1)$ figurines à acheter, en tout.
Pour trouver une estimation des quantiles, ce sera dans http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.210.6546 (qui donne en plus une expression explicite et simple des constantes cachées dans le $O$ par l’article précédent).
Enfin, pour une généralisation si les figurines ne sont pas équiprobables, c’est calculé dans https://dx.doi.org/10.1016%2F0166-218X%2892%2990177-C.
Allez, je remets mon petit grain de sel, toujours sans aucune connaissance mathématiques : avez vous tenu compte dans les calculs du fait que toutes les figs n’apparaissent pas avec la meme fréquence dans les boites complètes ? A savoir, Lego organise la rareté pour certaines des figs, donc il n’existe pas au départ la meme chance de trouver l’une ou l’autre.
non, j’avoue qu’ici tout est supposé uniforme… maintenant, c’est super facile avec ce code pour changer la distribution des figurines dans les sachets… par exemple, si on suppose que la dernière est 2 fois mois présente que les autres, on utilise dans le code précédant
no=sample(1:16,size=1,prob=c(rep(1,15),1/2))
Ainsi on a besoin effectivement, en moyenne de plus de sachets (58 et plus 54)
> tirage=function(k=1){
+ test=FALSE
+ cpte=0
+ M=rep(0,16)
+ while(!test){
+ no=sample(1:16,size=1,prob=c(rep(1,15),1/2))
+ M=f(M,no)
+ cpte=cpte+1
+ if(min(M)==k) test=TRUE
+ }
+ return(list(compte=M,
+ nbre=cpte))
+ }
>
> N=unlist(lapply(1:10000,function(x) tirage(1)$nbre))
> mean(N)
[1] 58.1278
c’est facile de créer la rareté, et optimiser les gains, pour Lego. Par exemple, si une figurine est 5 fois mois présente que les autres, on passe de 54 à 90 sachets à acheter, en moyenne (en jouant tout seul)
> tirage=function(k=1,ratio=5){
+ test=FALSE
+ cpte=0
+ M=rep(0,16)
+ while(!test){
+ no=sample(1:16,size=1,prob=c(rep(1,15),1/ratio))
+ M=f(M,no)
+ cpte=cpte+1
+ if(min(M)==k) test=TRUE
+ }
+ return(list(compte=M,
+ nbre=cpte))
+ }
>
> N=unlist(lapply(1:10000,function(x) tirage(1,ratio=5)$nbre))
> mean(N)
[1] 89.8712