2012-11-07 2 views
-1

ce sont les fonctions utilisées pour lancer les dés.Python - Déterminer la fréquence des numéros apparaissant dans les jets de dés

def roll() -> int: 
    ''' Return a roll of two dice, 2-12 
    ''' 
    die1 = randint(1, 6) 
    die2 = randint(1, 6) 
    return die1 + die2 

def roll_dice(n:int): 
    '''list the results of rolls''' 
    for i in range(n): 
     print(roll()) 

Maintenant, j'ai besoin d'aide pour faire une fonction pour créer une liste de statistiques sur les numéros déroulés.

par exemple: après l'impression de ladite fonction, il faut imprimer somethings comme ceci selon mon laboratoire:

Distribution of dice rolls 

2: 55 (2.8%) ** 
3: 129 (6.5%) ****** 
4: 162 (8.1%) ******** 
5: 215 (10.8%) ********** 
6: 279 (14.0%) ************* 
7: 341 (17.1%) ***************** 
8: 271 (13.6%) ************* 
9: 210 (10.5%) ********** 
10: 168 (8.4%) ******** 
11: 112 (5.6%) ***** 
12: 58 (2.9%) ** 
----------------- 
    2000 rolls 

aide est appréciée. Merci

+0

Avez-vous essayé quoi que ce soit vous-même? Si oui, incluez le code. Si vous essayez de nous faire faire votre maison, essayez quelque chose d'abord et demandez des détails. – Difusio

+2

http://docs.python.org/2/tutorial/datastructures.html#dictionaries –

+0

@mgilson ce sont des annotations de fonctions: http://www.python.org/dev/peps/pep-3107/ – Bakuriu

Répondre

0
from collections import defaultdict 
def roll_dice(n): 
    '''list the results of rolls''' 
    d = defaultdict(int) 
    for i in range(n): 
     res = roll() 
     d[res] += 1 #accumulate results 
     print(res) 

    print ("RESULTS") 
    #sort and print results. Since there's only 11 items, 
    # There is no sense using `iteritems()` here. We'd 
    # just have to change it for py3k... 
    for key,value in sorted(d.items()): 
     percent = float(value)/n*100 
     #print results. Use explicit field widths to make sure the "bargraph" is aligned. 
     print ('{0:2d}:{1:4d}\t({2:6f}%)\t{3}'.format(key,value,percent,int(percent)*'*')) 


roll_dice(2000) 
+1

Au lieu de 'defaultdict' vous pouvez aussi utiliser' Counter' comme 'd = Counter (roll() pour _ dans la gamme (n))'. [python> = 2.7 or> = 3.1] – Bakuriu

0

Si vous êtes ok avec une sortie graphique, vous pouvez utiliser le histogram method from matplotlib.

Ou vous pouvez créer manuellement les bacs dont vous avez besoin, ici les nombres entiers compris entre 2 et 12, et simplement compter le nombre de rouleaux dans chaque bac. Normaliser par votre numéro de rouleau pour obtenir le pourcentage et ajouter une étoile pour chaque 1% (apparemment arrondi vers le bas).

Cela donne le code suivant (python 2.X) après quelques modifications:

import random 
import math 

def roll(): 
    ''' Return a roll of two dice, 2-12 
    ''' 
    die1 = random.randint(1, 6) 
    die2 = random.randint(1, 6) 
    return die1 + die2 

def roll_dice(npts): 
    '''list the results of rolls''' 
    bins = dict([(n,0) for n in xrange(2,13,1)]) 
    for n in xrange(npts): 
     idx = roll() 
     print idx 
     bins[idx] = bins[idx] + 1 

    for n in xrange(2,13,1): 
     pct = bins[n]/float(npts) * 100.0 
     pct_star = '' 
     for i in xrange(int(math.floor(pct))): 
      pct_star = pct_star + '*' 
     str = "{0:.1f}%".format(pct).rjust(5,' ') 
     print "{0:2d}: {1:5d} ({2:s}) {3:s}".format(n,bins[n],str,pct_star) 
    print "------------------" 
    print "{0:10d} rolls".format(npts) 

if __name__ == "__main__": 
    npts = 20000 
    roll_dice(2000) 

qui sort

2: 569 (2.8%) ** 
3: 1131 (5.7%) ***** 
4: 1770 (8.8%) ******** 
5: 2229 (11.1%) *********** 
6: 2778 (13.9%) ************* 
7: 3307 (16.5%) **************** 
8: 2703 (13.5%) ************* 
9: 2231 (11.2%) *********** 
10: 1633 (8.2%) ******** 
11: 1128 (5.6%) ***** 
12: 598 (3.0%) ** 
------------------ 
    20000 rolls 
+0

sympa, j'ai testé ce code. les bacs devraient être avec 0 initialisé cependant. J'utiliserais 2-12 comme clés, au lieu de n-2. – RParadox

+0

Mais alors je devrais utiliser un dictionnaire et non une liste, n'est-ce pas? Comment puis-je obtenir une liste dont le premier index n'est pas 0? – FrenchKheldar

+1

oui, utilisez un dict(). chaque liste est vide ou a un index 0. – RParadox

Questions connexes