collection d'étiquettes

 

DC Comme beaucoup d'enfants de son âge, ma fille adore les albums d'étiquettes (les étiquettes p*nini). Dans un de ces albums, il y a 235 étiquettes. Combien me faudra-t-il acheter de paquets de 5 étiquettes pour avoir une collection complète ?

Difficile de répondre exactement à cette question, simulons donc cette expérience en convenant que les étiquettes sont uniformémént réparties dans tous les paquets et que dans un paquet de 5 il n'y a pas de doubles. On va donc faire 1000 albums complets (séparément) et calculer en moyenne le nombre de paquets utilisés.

J'utilise le package math pour calculer la moyenne des 1000 expériences à la fin, on peut aussi utiliser l'extension math pour calculer l'écart-type ou encore faire un histogramme des 1000 expériences etc.

 package require math

 proc paquet {cardCollection} {
     set liste {}
     # 5 etiquettes dans un paquet
     set i 1
     while {$i<=5} {
 	# on tire au hasard une etiquette
 	set r [expr {int(rand()*$cardCollection+1)}]
 	# on verifie qu'elle n'a pas deja ete tiree dans le paquet
 	# avant de l'utiliser
 	if {[lsearch -exact $liste $r]==-1} {
 	    lappend liste $r
 	    incr i
 	}
     }
     return $liste
 }

 proc experience {cardCollection} {
     # on cree une liste des etiquettes possedees
     # au debut on en a pas => on met 0
     for {set i 1} {$i<=$cardCollection} {incr i} {
 	lappend etiquettes 0
     }

     # produit est le produit des elements de la liste
     set produit 0
     # compteur compte le nombre de paquets d'etiquettes
     set compteur 0
     while {$produit==0} {
 	# on met des 1 pour les etiquettes obtenues
 	foreach numero [paquet $cardCollection] {
 	    lset etiquettes [expr {$numero-1}] 1
 	}
 	# on calcule le produit
 	set nb 1
 	for {set i 0} {$i<$cardCollection} {incr i} {
 	    set nb [expr {$nb*[lindex $etiquettes $i]}]
 	    # s'il en manque un, ca vaut zero et on peut arreter
 	    if !$nb break
 	}
 	set produit $nb
 	# no comment !
 	incr compteur
     }
     return $compteur
 }

 set nbEtiquettes 235

 for {set j 1} {$j<=1000} {incr j} {
     lappend exp [experience $nbEtiquettes]
 }

 puts [eval math::mean $exp]

et voilà le résultat :

 282.548

soit l'achat d'environ 280 paquets à 50 centimes d'euro le paquet ... ça fait cher l'album ! Bref, vive les échanges ou l'achat direct de l'album complet avec les étiquettes :))