尝试找出骰子掷骰结果在随机掷出的n面骰子列表中出现的频率

时间:2018-10-08 15:30:18

标签: python python-3.x random dice

我正在尝试查找边数为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 :(得分:1)

(据我所知)最快的方法是使用集合中的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})

作为更完整的程序,包括输入带有验证的面数和抛出数:

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+] 1
Try gain, number must be 4 or more  

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

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

How many throws? [1+] 100    

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(..)及其format examples

看看验证用户输入的非常好的答案:Asking the user for input until they give a valid response


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}

答案 1 :(得分:0)

您可以使用dictionary将其缩小一点。对于骰子之类的东西,我认为一个不错的选择是使用random.choice并从填充有骰子侧面的列表中绘制。首先,我们可以使用rolls从用户那里收集sidesinput()。接下来,我们可以使用sides生成我们要从中提取的列表,您可以使用randint方法代替它,但是对于使用choice的我们可以在{{1 }}。接下来,我们可以使用range(1, sides+1)来启动字典,并制作一个字典,其中所有面都是键,值为dict。现在看起来像0。从这里开始,我们可以使用d = {1:0, 2:0...n+1:0}循环来填充字典,将for添加到要滚动的任何面。另一个for循环将使我们打印出字典。奖金。我加入了一个1函数,该函数获取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]))