Inscription / Connexion Nouveau Sujet
Niveau exercices
Partager :

Probabilité

Posté par
flight
19-10-21 à 13:57

Bonjour

Je vous propose l'exercice suivant , on se donne les entiers allant de 1 à 10 , on effectue un tirage successif et sans remise au hasard de 5 entiers dans cet ensemble , Quelle est la probabilité que la différence entre deux entiers successifs du tirage soit strictement supérieure à 1 en valeur absolue ?  exemple  de tirage qui convient:  8 2  5  1  6  
exemple  de tirage qui ne convient pas :  8 2  5  4  6

Posté par
MatheuxMalin
re : Probabilité 20-10-21 à 00:07

La réponse est-elle 14700*(5!)/(10!) soit environ 48.6% de chances ?

Posté par
ty59847
re : Probabilité 20-10-21 à 10:22

D'où vient le 14700 ?
D'où vient le 5!
Et on voit assez bien d'où vient le 10!

Le 5! me paraît très suspect.

Ici, à part un recensement exhaustif des 10!configurations, je ne vois pas trop de méthode.
Le gros problème, c'est que les tirages ne sont pas du tout indépendants. Si on commence par 6,3,5  ... ou par 7,3,5, la proba que la 4ème boule donne un clash n'est pas la même.

Posté par
Vassillia
re : Probabilité 20-10-21 à 18:51

Bonjour,
Je suis d'accord avec ty59847, je ne sais pas comment calculer cette probabilité facilement et comme les valeurs sont faibles, le plus rapide pour moi est de demander à un esclave numérique de le faire. Il me répond 967/2520 mais si vous avez plus élégant, je veux bien regarder.

import itertools
def ecart(list,n):
  compt=0
  nb=0
  for subset in itertools.permutations(list,int(n)):
    nb+=1
    for i in range(n-1):
        if subset[i+1]==subset[i]+1 or subset[i+1]==subset[i]-1:
            compt+=1
            break
  return((nb-compt)/nb)

print(ecart([1,2,3,4,5,6,7,8,9,10],5))

Posté par
flight
re : Probabilité 20-10-21 à 20:58

Bravo à Vassilia c'est bien la réponse attendue  

Posté par
carpediem
re : Probabilité 21-10-21 à 12:24

merci à Vassillia de m'avoir obligé à aller voir ce qu'est ce module itertools que je rencontrais souvent sans savoir ce qu'il faisait !!

Posté par
Ulmiere
re : Probabilité 21-10-21 à 16:25

Vassillia @ 20-10-2021 à 18:51

Bonjour,
Je suis d'accord avec ty59847, je ne sais pas comment calculer cette probabilité facilement et comme les valeurs sont faibles, le plus rapide pour moi est de demander à un esclave numérique de le faire. Il me répond 967/2520 mais si vous avez plus élégant, je veux bien regarder.

[... code ici qui fait bugger l'affichage du mien à cause des crochets entourant le i interprétés comme une ordre de mise en italique par la regex qui parse ce message ...]




Pas très optimal comme code. On peut utiliser simplement range(10) (qui est un générateur doncne consomme aucune mémoire) à la place de la liste. Aussi,le calcul de nb à coups d'incréments est inutiles parce qu'on sait à l'avance que c'est \binom{10}{5}\times 5!
Python a aussi des fonctions any et all pour éviter les break et qui sont plus rapides a priori que la version  manuelle. On peut sommer les booleens qu'elles renvoient considérés en contexte entier pour trouver compt, le nombre d'erreurs de casting. Et on peut même paralléliser cela si on veut

from math import gcd, comb, factorial
import itertools

def ecart(N, n):
	nb = comb(N,n)*factorial(n)#30240#__import__("math").comb(len(list),5)
	compt = sum( any( (subset[i+1]-subset[i])**2<2 for i in range(n-1) ) for subset in itertools.permutations(range(N), n) )
	u, v, g = nb-compt, nb, gcd(nb-compt,nb)
	return "%d/%d"%(u//g,v//g)

N,n = 10,5
print(ecart(N,n))

Posté par
Ulmiere
re : Probabilité 21-10-21 à 16:27

Il y a un commentaire en trop qui correspond à des tests que j'effectuais.
Si quelqu'un qui a les droits pour éditer mon post pouvait supprimer "#30240#__import__("math").comb(len(list),5)" du code ci-dessus, ainsi que le présent message, ce serait peut-être plus lisible

Posté par
Ulmiere
re : Probabilité 21-10-21 à 16:41

Et voici une version pour les gens qui n'ont pas au moins python 3.8 (pour la fonction comb)
Désolé du triple post


def ecart(N, n):
	nb = __import__("functools").reduce(lambda x,y:x*y,range(N-n+1,N+1),1)
	compt = sum(all((s[i+1]-s[i])**2>1 for i in range(n-1))for s in __import__("itertools").permutations(range(N),n))
	g = __import__("math").gcd(compt,nb)
	return "%d/%d"%(compt//g, nb//g)
print(ecart(10,5))

Posté par
Vassillia
re : Probabilité 21-10-21 à 18:56

J'avoue que je n'ai pas cherché à optimiser le code, je savais vu les petites valeurs que ça passerait sans problème donc j'y suis allée tranquille.

Mais même si j'avais voulu, je n'aurais pas fait aussi bien que toi. Je connais mal python, je m'y suis mise comme c'est le langage à la mode sur les forums et il faut admettre que c'est facile à lire et à écrire. Merci Ulmiere pour la sommation des booléens, j'aime bien et je ne savais pas donc je m'en reservirai à l'occasion

Carpediem, c'est surtout de la flemme de ma part, il y avait fort à parier que lister les combinaisons et les permutations avait deja été fait par quelqu'un et une petite recherche me l'a donné directement. Tant mieux si ça peut te resservir, je présume que c'est mieux optimisé que tout ce que j'aurais pu faire.

Posté par
jandri Correcteur
re : Probabilité 21-10-21 à 19:07

Bonjour,

si l'on se réfère à l'OEIS il semble qu'il n'existe pas de formule relative à ce problème.

Pour n=10 et k=5 on lit T(10,5)=11604 d'où la probabilité \dfrac{11604}{10\times9\times8\times7\times6}=\dfrac{967}{2520}

Posté par
carpediem
re : Probabilité 21-10-21 à 20:45

Vassillia  et  Ulmiere  : je ne suis pas très doué en python même si j'avais bien vu qu'on pouvait "un peu" optimiser le code ...

mais l'optimisation de Ulmiere dépasse mes connaissances ... et donc le rend plus "kabbalistique" et ésotérique !!!  

Posté par
Ulmiere
re : Probabilité 22-10-21 à 16:08

J'explique, donc

Il y'a deux optimisations différentes. La première consiste à éviter d'incrémenter nb de tour de boucle en tour de boucle à lui donner directement sa valeur finale (5 parmi 10)*(5!). C'est évidemment beaucoup plus rapide que de faire 30240 tours de boucle à la fin desquels on ferait nb <- nb +1. La seconde c'est autre chose.

***

for subset in itertools.permutations(range(N), n)
énumère toutes les suites de 5 éléments tous différents de [1,2,3,4,5,6,7,8,9,10]


*** any(iterable) parcourt iterable et renvoie True dès qu'on trouve un élement de iterable qui vaut True. C'est équivalent à

def any(iterable):
    for x in iterable:
        if (x == True):
            return True
    else:
        return False


Dans le même genre all(iterable) revoie True si et seulement si tous les élements de iterable sont True.

*** Python convertit les booleens True et False en 1 et 0 respectivement quand il comprend qu'on veut s'en servir comme des entiers
Par conséquent, si j'écris
sum( any(iterable) for iterable in conteneur )
je suis en train de sommer des 0 et des 1. Le résultat de ce truc est le nombre d'élements de conteneur ayant au moins un élément qui est True


*** L'algorithme de Vassillia consiste à parcourir toutes les possibilités et à compter combien de possibilités sont vilaines et elle revie ensuite le ratio (nombre de bonnes pioches)/(nombre total) = (nombre total - nombre de mauvaises pioches)/(nombre total) == (nb - compt)/nb

où nb = (5 parmi 10)*(5!) est le nombre total
et
compt = sum( any( (subset[i+1]-subset[i])**2<2 for i in range(n-1) ) for subset in itertools.permutations(range(N), n) )


compte le nombre de mauvaises pioches, i.e de suites qui ont deux éléments consécutifs


*** Cette façon de faire est plus rapide parce que Python est assez intelligent pour casser le travail en petits morceaux executés en parallèle de manière transparente. Même s'il ne l'est pas assez, tu peux le forcer à faire comme ça avec un peu de travail
Aussi, je ne suis pas certain pour Python mais la plupart des langages permettent de calculer nb en parallèle de compt puisque compt ne dépend pas de nb

Posté par
dpi
re : Probabilité 22-10-21 à 17:51

Bonjour
Je donne mon humble réponse

 Cliquez pour afficher

Posté par
carpediem
re : Probabilité 22-10-21 à 18:06

merci beaucoup à Ulmiere pour tes éclaircissements

j'avais à peu près compris mais voulais être sûr ne connaissant pas vraiment l'utilisation de any et all ...

c'est vraiment très efficace donc

Posté par
dpi
re : Probabilité 22-10-21 à 18:19

Mon dénominateur est trop faible (sauté  2737 tirages )

 Cliquez pour afficher

Posté par
dpi
re : Probabilité 23-10-21 à 10:53

Bonjour,
Comme j'avais listé les 11604 candidats,j'ai voulu dénombrer ceux qui étaient premiers.
Ils sont 966 de 1 3 5 9 7  à  9 7 10 6  3   (13 597 à 971 063 )
Bonne chance aux vérificateurs

Posté par
Ulmiere
re : Probabilité 23-10-21 à 12:34

dpi @ 23-10-2021 à 10:53

Bonjour,
Comme j'avais listé les 11604 candidats,j'ai voulu dénombrer ceux qui étaient premiers.
Ils sont 966 de 1 3 5 9 7  à  9 7 10 6  3   (13 597 à 971 063 )
Bonne chance aux vérificateurs


Comme souvent avec les plus grands premiers inférieurs à une puissance de 10, il y a comme un pattern


N = 10, n = 1, nb = 10 : (7, 7)
N = 10, n = 2, nb = 90 : (107, (10, 7))
N = 10, n = 3, nb = 720 : (8101, (8, 10, 1))
N = 10, n = 4, nb = 5040 : (97103, (9, 7, 10, 3))
N = 10, n = 5, nb = 30240 : (971063, (9, 7, 10, 6, 3))
N = 10, n = 6, nb = 151200 : (9758101, (9, 7, 5, 8, 10, 1))
N = 10, n = 7, nb = 604800 : (97581041, (9, 7, 5, 8, 10, 4, 1))
N = 10, n = 8, nb = 1814400 : (975864103, (9, 7, 5, 8, 6, 4, 10, 3))
N = 10, n = 9, nb = 3628800 : (9758631041, (9, 7, 5, 8, 6, 3, 10, 4, 1))
N = 10, n = 10, nb = 3628800 : (97586210413, (9, 7, 5, 8, 6, 2, 10, 4, 1, 3))





Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !