Bonjour,
Ta procédure de test ne va pas, et ceci pour plusieurs raisons :
1°) La plus grave est ta façon de tirer au hasard le numéro de l'équipe pour chaque joueur.
random()*10 te rend un nombre suivant une loi uniforme sur [0,10[. Quand tu prend la partie entière du reste dans la division par 4, tu as 3 chances sur 10 de trouver 0, 3/10 de trouver 1, 1/5 de trouver 2 et 1/5 de trouver 3. Pas du tout équiprobable, donc.
2°) Tu interprètes "moins de 10" par "au plus 10" puisque ta condition est
if teams[team]
<= playersQtyMin:
3°) Quand dans un essai tu as plus d'une équipe qui a au plus playersQtyMin joueurs, tu augmentes la longueur de ta liste de succès du nombre d'équipes vérifiant cette condition, au lieu de l'augmenter de 1.
Voici une procédure correcte :
- Code: Tout sélectionner
import random as rd
def Test(nbEssais,minJoueurs) :
nbMoins=0
for essai in range(nbEssais) :
Eq=[0,0,0,0]
for joueur in range(99) :
numEq=rd.randrange(4)
Eq[numEq]+=1
if min(Eq)<minJoueurs : nbMoins+=1
print("Nombre d'essais : {0}\n\
Pourcentage des essais pour lesquels une équipe a moins de {1} joueurs :\n\
{2:.3%}".format(nbEssais,minJoueurs,nbMoins/nbEssais))
Quand tu essaies pour 10 joueurs :
- Code: Tout sélectionner
Test(10**7,10)
Tu obtiens, au bout d'un certain temps :
- Code: Tout sélectionner
Nombre d'essais : 10000000
Pourcentage des essais pour lesquels une équipe a moins de 10 joueurs :
0.020%
Ceci est tout à fait conforme au résultat théorique trouvé avec la procédure donnée plus haut :
- Code: Tout sélectionner
probabilité d'avoir au moins une équipe avec moins de 10 joueurs :
1317761046901684365136107277304555426687426182921337095/6277101735386680763835789423207666416102355444464034512896
soit à peu près 0.0209931%
Ce résultat théorique s'obtient d'ailleurs beaucoup plus rapidement.
PS. Une précision qui t'a peut-être échappée : la procédure que j'ai écrite dans un précédent message n'est pas une simulation, contrairement à celle que je viens d'écrire. Elle donne un résultat mathématiquement exact.