Попытка найти, как часто результат броска костей встречается в списке случайно брошенных n-сторонних костей - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь найти вхождения каждого числа для сторон, идущих от 1 до количества сторон в броске костей.Я хотел бы, чтобы программа находила число вхождений для каждого числа в listRolls.

Пример: если бы была 6-гранная игральная кость, то это было бы от 1 до 6, и список будет бросать кости x раз, и я хотел бы узнать, сколько раз игральные кости бросили 1, и так далее.и так далее.

Я новичок в Python и пытаюсь выучить его!Любая помощь будет оценена!

import random
listRolls = []

# Randomly choose the number of sides of dice between 6 and 12
# Print out 'Will be using: x sides' variable = numSides
def main() :
   global numSides
   global numRolls

   numSides = sides()
   numRolls = rolls()

rollDice()

counterInputs()

listPrint()


def rolls() :
#    for rolls in range(1):
###################################
##    CHANGE 20, 50 to 200, 500  ##
##
    x = (random.randint(20, 50))
    print('Ran for: %s rounds' %(x))
    print ('\n')
    return x

def sides():
#    for sides in range(1):
    y = (random.randint(6, 12))
    print ('\n')
    print('Will be using: %s sides' %(y))
    return y

def counterInputs() :
    counters = [0] * (numSides + 1)   # counters[0] is not used.
    value = listRolls

#    if value >= 1 and value <= numSides :
#         counters[value] = counters[value] + 1

for i in range(1, len(counters)) :
  print("%2d: %4d" % (i, value[i]))

print ('\n')

#  Face value of die based on each roll (numRolls = number of times die is 
thrown).
#  numSides = number of faces)
def rollDice():     
    i = 0
    while (i < numRolls):
        x = (random.randint(1, numSides))
        listRolls.append(x)
#            print (x)   
        i = i + 1
#        print ('Done')

def listPrint():
    for i, item in enumerate(listRolls):
        if (i+1)%13 == 0:
            print(item)
    else:
        print(item,end=', ')
print ('\n')





main()

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы можете немного обрезать это, используя dictionary.Для таких вещей, как игра в кости, я думаю, что хорошим вариантом является использование random.choice и просто рисование из списка, который вы заполняете сторонами кубика.Итак, для начала мы можем получить rolls и sides от пользователя, используя input().Затем мы можем использовать sides для генерации нашего списка, из которого мы извлекаем, вы можете использовать метод randint вместо этого, но для использования choice мы можем создать список в range(1, sides+1).Затем мы можем инициировать словарь, используя dict, и создать словарь со всеми сторонами в качестве ключей со значением 0.Теперь выглядит так: d = {1:0, 2:0...n+1:0}. Отсюда теперь мы можем использовать цикл for, чтобы заполнить наш словарь, добавляя 1 в любую сторону, к которой катится.Другой цикл for позволит нам распечатать наш словарь.Бонус.Я добавил max функцию, которая берет элементы в нашем dictionary и сортирует их по values и возвращает наибольшее tuple из (key, value).Затем мы можем напечатать наиболее свернутое утверждение.

from random import choice

rolls = int(input('Enter the amount of rolls: '))
sides = int(input('Enter the amound of sides: '))
die = list(range(1, sides+1))
d = dict((i,0) for i in die) 

for i in range(rolls):
    d[choice(die)] += 1

print('\nIn {} rolls, you rolled: '.format(rolls))
for i in d:
    print('\tRolled {}: {} times'.format(i, d[i]))

big = max(d.items(), key=lambda x: x[1])
print('{} was rolled the most, for a total of {} times'.format(big[0], big[1]))
Enter the amount of rolls: 5
Enter the amound of sides: 5

In 5 rolls, you rolled: 
  Rolled 1: 1 times
  Rolled 2: 2 times
  Rolled 3: 1 times
  Rolled 4: 1 times
  Rolled 5: 0 times
2 was rolled the most, for a total of 2 times
0 голосов
/ 08 октября 2018

Самый быстрый способ (я знаю) использует Counter() из коллекций (см. Дно для замены только для диктовок):

import random

from collections import Counter

# create our 6-sided dice
sides = range(1,7)  
num_throws = 1000

# generates num_throws random values and counts them
counter = Counter(random.choices(sides, k = num_throws))

print (counter) # Counter({1: 181, 3: 179, 4: 167, 5: 159, 6: 159, 2: 155})
  • collections.Counter([iterable-or-mapping])) - это специализированный словарь, который считает вхождения в итерируемом вами сообщении.

  • random.choices(population, weights=None, *, cum_weights=None, k=1) использует данную итерацию (диапазон (1,7) == 1,2,3,4,5,6 и рисует k вещи из него, возвращая их в виде списка.

  • range(from,to[,steps]) генерирует неизменную последовательность и заставляет random.choices работать даже лучше, чем при использовании списка.


Как более полная программа, включающая ввод количества лиц и бросков с проверкой:

def inputNumber(text,minValue):
    """Ask for numeric input using 'text' - returns integer of minValue or more. """
    rv = None
    while not rv:
        rv = input(text)
        try:
            rv = int(rv)
            if rv < minValue:
                raise ValueError
        except:
            rv = None
            print("Try gain, number must be {} or more\n".format(minValue))
    return rv


from collections import Counter
import random

sides = range(1,inputNumber("How many sides on the dice? [4+] ",4)+1)  
num_throws = inputNumber("How many throws? [1+] ",1)
counter = Counter(random.choices(sides, k = num_throws))

print("")
for k in sorted(counter):
    print ("Number {} occured {} times".format(k,counter[k])) 

Вывод:

How many sides on the dice? [4+] <b>1</b>
Try gain, number must be 4 or more  

How many sides on the dice? [4+] <b>a</b>
Try gain, number must be 4 or more  

How many sides on the dice? [4+] <b>5</b>
How many throws? [1+] <b>-2</b>
Try gain, number must be 1 or more  

How many throws? [1+] <b>100</b>    

Number 1 occured 22 times
Number 2 occured 20 times
Number 3 occured 22 times
Number 4 occured 23 times
Number 5 occured 13 times

ВыИспользуя способ форматирования строки Python 2.x, прочитайте о format(..) и его примерах форматирования .

Посмотрите на очень хорошие ответы для проверки вводаот пользователя: Запрашивая у пользователя ввод, пока он не даст действительный ответ


Замена на Counter, если вам не разрешено его использовать:

# create a dict
d = {}

# iterate over all values you threw
for num in [1,2,2,3,2,2,2,2,2,1,2,1,5,99]:
    # set a defaultvalue of 0 if key not exists
    d.setdefault(num,0)
    # increment nums value by 1
    d[num]+=1

print(d)  # {1: 3, 2: 8, 3: 1, 5: 1, 99: 1}
...