【问题标题】:Exploring Python Exercise探索 Python 练习
【发布时间】:2012-08-15 05:58:31
【问题描述】:

我正在从 Timothy Budd 的 Exploring Python 一书中学习 Python。本章的一个练习是这样的:

15。 random 模块中的函数randint 可用于生成随机数。例如,对random.randint(1, 6) 的调用将以相等的概率产生值 1 到 6。编写一个循环 1000 次的程序。在每次迭代中,它对randint 进行两次调用以模拟掷骰子。计算两个骰子的总和,并记录每个值出现的次数。在循环之后,打印总和数组。您可以使用本章前面显示的惯用语来初始化数组:

times = [0] * 12 # make an array of 12 elements, initially zero

我可以在数组中打印总和,但是我还没有理解记录每个值出现次数的概念。另外,times = [0] 的用途是什么?这是我打印总和的代码:

 #############################################
#   Program to print the sum of dice rolls  #
#############################################

from random import randint
import sys


times = [0] * 12

summation = []

def diceroll():

    print "This program will print the"
    print "sum of numbers, which appears"
    print "after each time the dice is rolled."
    print "The program will be called 1000 times"



    for i in range(1,1000):

        num1 = randint(1,6)
        num2 = randint(1,6)

        sum = num1 + num2
        summation.append(sum)
        #times[i] = [i] * 12
    print summation
    #print times


diceroll()

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    times[0] * 12 启动一个包含 12 个元素的列表,值为 0。你接下来要做的是

    times[s] += 1 #adds 1 to the number of times s occurs
    

    这类似于使用 dict 对值进行编码,但更简单。

    times = [0] 初始化一个称为 times 长度为 1 和值为 0 的列表。习语 times = [0] * 12 表示 times 是一个由 12 个零组成的列表。

    如果您希望在num1==num2==6 时能够在没有keyerror 的情况下使用它,则需要使用times = [0]*13,因为python 是一个0 索引系统。

    旁注:不要使用sum 作为变量名,因为它是一个内置函数(预定义)并且您不想覆盖它。请改用times[sum([num1,num2])] += 1times[num1+num2]

    【讨论】:

    • 所以 summation[sum(num1 + num2)] +=1 会给我骰子的总和。
    • num1 + num2 已经是一个总和,因此无需调用sum。无论如何,这是一个TypeError,因为sum 需要一个列表。但是,是的,将times[sum] += 1 放入你的循环中而不是summation.append(sum) 会给你掷骰子的总和。
    • 不,它会更新列表总和以记录正确的数字。 summation[i] 将为您提供加起来为 i 的总和数(如果 i
    • 由于 python 列表是 0 索引的,如果您希望能够调用 times[12],您实际上需要将时间作为 13 个列表启动
    • 哦,是的,我的错,我想写 Sum,而不是写 sum。感谢您指出这一点。
    【解决方案2】:

    统计出现次数:

    times = [0]*13
    for _ in range(1000):
        sum_ = randint(1, 6) + randint(1, 6)
        times[sum_] += 1
    
    print(times[2:])
    

    sum_ 的可能值为 2...12,包括。可能的 times 索引为 0...12,包括。

    times[i] 对应于 1000 次尝试中 sum_ == i 的出现次数。

    注意:times[0]times[1] 始终为零,因为 sum_ > 1

    [x]*3 产生 [x, x, x] 这是一个更好的版本:

    L = []
    L.append(x)
    L.append(x)
    L.append(x)
    

    关于您的代码的其他 cmets:

    • print something 是 Python 3 上的错误
    • for i range(1, 1000) 是错误的。它产生从 1 到 999 的 i,包括(999 次迭代,而不是根据需要的 1000 次)。 range 不包括上限,因为它需要编程间隔。

    【讨论】:

    • times[sum_-1] += 1,那-1是不是为了倒序?
    • Sebastian:是的,范围必须从 0 到 1001,才能迭代 1000 次。另外,对于第一个总和,times = 0,但是当第一个总和出现时,时间或发生不为零,我想这是一个错误。
    • @vamosrafa:我稍微简化了代码。据我所知,没有错误。我最初认为times = [0]*12 是练习的要求。
    • 塞巴斯蒂安:我现在明白这个问题了。假设 sum 为 4,并且 4 出现了 24 次,所以在 times 数组中,打印 sum 的出现次数。长度为 12,因为 dice 是从 1 到 6,所以两个 dice = 12。另外,数组元素的总和为 1000。感谢您的帮助。
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 2016-01-27
    • 2017-01-11
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多