2013-12-04 4 views
-4

Нужна помощь в создании вертикальной гистограммы с «#» для количества рулонов, которые я получаю. Он будет содержать не более 80 символов. Это то, что у меня есть до сих пор. Я могу получить все, чтобы напечатать то, что мне нужно, за исключением того, что у меня много проблем с моей гистограммой.Игра в кости. Гистограмма?

import random 
from collections import defaultdict 

def main(): 
    dice = int(input("Enter the number of dice: ")) 
    sides = int(input("Enter the number of sides: ")) 
    rolls = int(input("Enter the number of rolls to simulate: ")) 
    result = roll(dice, sides, rolls) 
    for i in range(dice, dice * sides + 1): 
     print('{:2d}{:10,d}{:10.4%}'.format(i, result[i], result[i]/rolls)) 
    print(histogram(result, dice, sides, rolls)) 

def roll(dice, sides, rolls): 
    d = defaultdict(int) 
    for i in range(rolls): 
     d[sum(random.randint(1, sides) for i in range(dice))] += 1 
    return d 

def histogram(result, dice, sides, rolls): 
    maxBar = str(80) 
    for x in result: 
     p = str(x) 
     if p <= maxBar: 
      p += '#' 
    return p 

main() 

пример Выход ::

5   7 0.0070% 
    6   64 0.0640% 
    7  191 0.1910% # 
    8  429 0.4290% ### 
    9  942 0.9420% ####### 
    10  1,629 1.6290% ############ 
    11  2,701 2.7010% ##################### 
    12  3,911 3.9110% ############################### 
    13  5,375 5.3750% ########################################## 
    14  6,849 6.8490% ###################################################### 
    15  8,383 8.3830% ################################################################## 
    16  9,371 9.3710% ########################################################################## 
    17  10,051 10.0510% ################################################################################ 
    18  9,972 9.9720% ############################################################################### 
    19  9,453 9.4530% ########################################################################### 
    20  8,371 8.3710% ################################################################## 
    21  7,022 7.0220% ####################################################### 
    22  5,517 5.5170% ########################################### 
    23  3,824 3.8240% ############################## 
    24  2,586 2.5860% #################### 
    25  1,661 1.6610% ############# 
    26  936 0.9360% ####### 
    27  462 0.4620% ### 
    28  195 0.1950% # 
    29   78 0.0780% 
    30   20 0.0200% 
+3

Пожалуйста, ваши попытки кода. –

+2

не просто отправляйте домашние задания самостоятельно, покажите свою работу и где вы застряли. –

+0

Мы поможем вам с вашим кодом, не работая для вас. – aIKid

ответ

1

лично я бы сделать что-то вроде этого:

import random 
from collections import defaultdict 

def main(): 
    dice = int(input("Enter the number of dice: ")) 
    sides = int(input("Enter the number of sides: ")) 
    rolls = int(input("Enter the number of rolls to simulate: ")) 
    result = roll(dice, sides, rolls) 
    maxH = 0 
    for i in range(dice, dice * sides + 1): 
     if result[i]/rolls > maxH: maxH = result[i]/rolls 
    for i in range(dice, dice * sides + 1): 
     print('{:2d}{:10d}{:8.2%} {}'.format(i, result[i], result[i]/rolls, '#' * int(result[i]/rolls/maxH * 40))) 


def roll(dice, sides, rolls): 
    d = defaultdict(int) 
    for _ in range(rolls): 
     d[sum(random.randint(1, sides) for _ in range(dice))] += 1 
    return d 

main() 
+0

Спасибо. Не могли бы вы помочь с частью гистограммы? – user3040301

+0

@ пользователь3040301 Gladyly. Я отредактировал свой ответ, и теперь он показывает гистограмму. – Hyperboreus

+0

Вопрос? Как бы вы сделали это, чтобы отобразить 80 «#» для максимального числа и почти снижать вверх и вниз оттуда? – user3040301

1

Если бы я тебя, я хотел бы использовать словарь для отслеживания результатов. Для каждого результата, который у вас есть, введите его в строку и проверьте, находится ли эта строка в словаре (в качестве альтернативы используйте try: except block и catch KeyError exceptions), если нет, то добавьте его, если так, то увеличьте его. Вот некоторые примеры кода:

num_dice = getNumDice() #however you're doing this 
num_sides = getSides() #however you're doing this 
num_rolls = getRolls() #however you're doing this 

result_dict = {} 

for _ in xrange(num_rolls): 
    result = str(rollDice(num_dice,num_sides)) #you can build this yourself, I'm not doing everything for you! :) 
    if result in result_dict: 
    result_dict[result] +=1 
    else: 
    result_dict[result] = 1 

#alternatively, using try/catch, see the commented code below 
#in place of the if/else block: 
# 
# try: 
# result_dict[result] +=1 
# except KeyError as e: 
# result_dict[result] = 1 
#------------------------------------------------------------ 

Это заполнит ваш result_dict с чем-то вроде { '2': 5 '3': 8, '4': 12, '5': 26, '6': 51 , '7': 92, '8': 50, ..., '12': 9}. Вы должны иметь возможность опроса этих данных для печати результатов. Если вам нужна дополнительная помощь, пожалуйста, прокомментируйте какой-нибудь пробный код, и я буду решать проблемы.

EDIT с запросом на гистограмму НИЖЕ

Для вашей гистограммы, вы должны вернуть функцию, которая отображает количество «#" S»вы должны номер вам нужен его. На самом деле получение правильного соотношения довольно простое перекрестное умножение.

sum_of_result num_of_hashes 
------------- = ------------- 
total_rolls  total_hashes 

Если передать эти переменные в функции гистограммы, она должна иметь возможность возвращать массив с сколько # 's должно быть рядом с каждым результатом, который вы можете включить в вашу функцию печати. Давайте дадим ему вихрь.

def histogram(roll_array,total_hashes=80): 
# that second argument lets us reuse this code for a 
# differently scaled histogram without changing our 
# code -- this is HUGE in coding. 

    total_rolls = sum([roll_array[i] for i in range(len(roll_array))]) 
# sums up all the results across the array. We could also 
# pass this directly to histogram, but (as before) this makes 
# the code a little more reusable. 

    output_array = defaultdict(int) 
    for i in range(len(roll_array)): 
    output_array[i] = roll_array[i]*total_hashes/total_rolls 
# this iterates through the output_array, setting each index equal 
# to the number of hashes we should use to accurately describe 
# each result, using the math I talked about earlier. 

    return output_array 

Теперь у нас есть функция, histogram (вероятно, лучше описать как make_histogram или т.д.), который возвращает массив (на самом деле словарь, но тот, который функционирует как массив) равной длины к массиву кости рулоны он прошел. Каждый индекс в этом массиве имеет значение, которое коррелирует с тем, сколько знаков решетки потребуется для точного отображения, что, учитывая количество выражается в roll_array (что, в вашей main функции, d)

Теперь для функции печати , Вы знаете, как умножение работает со строками, не так ли? Если нет, перейдите в IDLE и узнайте прямо сейчас. Тип "I Shall Always Experiment With Code\n" 50 раз, затем попробуйте умножить его на 50.

Прохладный, не так ли? Теперь вместо добавления второго оператора печати в конце main попробуйте использовать возвращаемый массив гистограммы (опять же, это словарь, но нам не нужно заботиться об этом прямо сейчас, поскольку все ключи являются номерами точно так же, как индексы в массив), чтобы отобразить эти # в строке с вашей текущей функцией печати.

Кроме того, это своего рода дискретная функция. Может стоить отделить его от вашей функции main и сделать def display_result(roll_array,hist_array): или что-то подобное.

Опять же, если вам нужна помощь, просто спросите.

Here мой полный код для этой проблемы, для любых будущих штабелеры :)

+0

Большое вам спасибо. Как бы вы напечатали его так, как должен выглядеть вывод? – user3040301

+0

Просто увидел ваше обновление для гистограммы. Если бы я был вами, я бы использовал String.format(), как в предыдущем примере, но ваша окончательная строка 'print (гистограмма (результат, кости, стороны, рулоны))' не будет работать так, как предполагалось, так как он создает другой набор строк под ним. Я подброшу что-нибудь в редактировании на мой ответ. Прежде чем я это сделаю, немного разъяснений. Какова шкала гистограмм? Есть 80 "#"? У верхнего ответа есть 80 "#?"? Это влияет на функцию гистограммы (которая является простой математикой, вы должны понять это самостоятельно, D) –

+0

@ user3040301: если вы полностью застреваете в любой момент, я включил свой [полный код для этой функции ] (http://pastebin.com/K6Nkjwey), но, пожалуйста, не просто скопируйте это и пойдите для него. Он содержит очень полезные уроки о форматировании строк, используя основную математику для решения сложных задач и т. Д. –

Смежные вопросы