我正在尝试查找边数为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()
答案 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})
collections.Counter([iterable-or-mapping])
)是一本专门的字典,它对您赋予它的可迭代次数进行计数。
random.choices(population, weights=None, *, cum_weights=None, k=1)
使用给定的可迭代(range(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+] 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
从用户那里收集sides
和input()
。接下来,我们可以使用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]))