2017-08-06 4 views
3

Le code suivant calcule la distribution de probabilité des résultats des deux dés avec un nombre variable de parties égales:Besoin de sortie les 3 premiers résultats de roulement 2 dés, qui ont un nombre variable de parties

def compute_probability_distribution(sides): 
    dist = {x+y: 0 for x in range(1, sides+1) for y in range(1, sides+1)} 
    for die_1 in range(1, sides+1): 
    for die_2 in range(1, sides+1): 
     dist[die_1+die_2] = dist[die_1+die_2] + 1 
    probs = dist.items() 
    print "Prob dist: ", probs 

Par exemple, pour les dés à 6 faces ordinaires, le prob dist est [(2,6), (3,2), (4,3), (5,4), (6,5), (7,6), (8,5),) (9,4), (10,3), (11,2), (12,1)], où le premier élément de chaque tuple est la somme des 2 dés, et le second élément est le nombre de façons dont il peut se produire sur un rouleau. Quelqu'un peut-il me dire comment trier la liste de prob prob ci-dessus par le deuxième élément de chaque tuple afin que je puisse sortir les occurrences les plus probables (1 ou 3)? Je pense utiliser le tri de liste intégré avec une sorte de fonction de comparaison.

Répondre

2
probs = [(2,6),(3,2),(4,3),(5,4),(6,5),(7,6),(8,5),(9,4),(10,3),(11,2),(12,1)] 

>>> sorted(probs, key=lambda x: x[1]) # x[1] is second element of tuple pair. 
[(12, 1), 
(3, 2), 
(11, 2), 
(4, 3), 
(10, 3), 
(5, 4), 
(9, 4), 
(6, 5), 
(8, 5), 
(2, 6), 
(7, 6)] 
1

Je voudrais simplement utiliser la structure de données qui est conçu pour cela: un Counter:

from collections import Counter 

def compute_probability_distribution(sides): 
    dist = Counter(die_1 + die_2 for die_1 in range(1, sides+1) for die_2 in range(1, sides+1)) 
    probs = dist.most_common(3) 
    print "Prob dist: ", probs

Pour deux 6-dices, ce alors produira:

>>> compute_probability_distribution(6) 
Prob dist: [(7, 6), (6, 5), (8, 5)] 

Nous obtenu six fois une somme de sept; cinq fois une somme de six; et cinq fois une somme de huit.

Si vous voulez faire le nombre de dices arbitraires, vous pouvez utiliser:

from collections import Counter 
from itertools import product 

def compute_probability_distribution(sides,ndices=2,common=3): 
    dist = Counter(sum(d) for d in product(range(1,sides+1),repeat=ndices)) 
    probs = dist.most_common(common) 
    print "Prob dist: ", probs

Alors maintenant, nous pouvons calculer les 10 sommes les plus courantes lorsque nous roulons trois 5-dices:

>>> compute_probability_distribution(5,3,10) 
Prob dist: [(9, 19), (8, 18), (10, 18), (7, 15), (11, 15), (6, 10), (12, 10), (5, 6), (13, 6), (4, 3)] 
+0

Votre solution utilisant Counter est intéressante, mais il manque le fait que 2 et 6 soient équiprobables. – CElliott

+0

@CElliott: l'esprit que nous utilisons ici * trois * dés, pas deux. Comment pouvez-vous générer 2 avec trois 5-dés? –

+0

Dans l'état initial du problème, les probs étaient donnés comme [(2,6), (3,2), (4,3), ...]. Le (2,6) était une faute de frappe; mon mauvais, désolé. Par conséquent, votre réponse pour un dé à 6 faces était correcte. Le monde a du sens après tout. – CElliott

2

Vous pouvez le faire avec une compréhension imbriquée, mais vous pouvez également calculer les valeurs les plus courantes à la main si vous connaissez le nombre de côtés.

Afin de plus en plus probable:

  • 2 et sides+sides qui ont seulement une "chance".
  • Alors 3 et sides+nsides-1 qui ont 2.
  • 4 et ont 3
  • ...
  • Enfin sides+1 a la plus forte probabilité qui est juste sides.

Si vous ne me croyez pas, regardez la distribution de probabilité pour différents nombres de côtés.

Donc, pour obtenir les 3 valeurs les plus courantes, vous pouvez simplement les calculer en fonction du nombre de côtés:

def compute_probability_distribution(sides): 
    print([(sides+1, sides), (sides, sides-1), (sides+2, sides-1)]) 

Toutefois, cela ne fonctionne que pour dices avec au moins 2 côtés. Pour un dés d'un seul côté, le résultat sera bizarre avec cette fonction.

+1

Votre droit; les probabilités forment le triangle de Pascal, qui a l'apex au milieu. J'ai vu ça, mais je n'ai pas pensé à l'utiliser car je voulais voir comment trier (ou trier) fonctionnait. Solution totalement brillante, cependant. – CElliott