掷两个骰子并统计结果
这是一个问题:
你需要写一个程序来模拟掷两个骰子的过程。
首先,你要询问用户想要模拟多少次掷骰子。然后,每次掷骰子时掷两个骰子。可以使用随机库里的randint函数(random.randint(1,6))来生成每个骰子的点数。
把两个骰子的点数相加,并记录每种可能的结果(从2到12)出现的次数,以及你掷出“对子”(两个骰子点数相同)的次数。
最后,打印出每个点数的出现次数、该点数的掷骰次数,以及它在总掷骰次数中的百分比:
示例输出
请输入掷骰次数:10000
2 - 266 2.660000%
3 - 580 5.800000%
4 - 881 8.810000%
5 - 1086 10.860000%
6 - 1418 14.180000%
7 - 1658 16.580000%
8 - 1363 13.630000%
9 - 1096 10.960000%
10 - 829 8.290000%
11 - 550 5.500000%
12 - 273 2.730000%
对子 - 1425 - 14.234000%
这是我的代码:
import random
def dice_roll():
return random.randint(1,6)
count = int(input("Enter the number of rolls: "))
number_of_double_dice = 0
results = [0 for x in range(13)]
for i in range(0,count):
first = dice_roll()
second = dice_roll()
sum = first + second
if(first == second):
number_of_double_dice = number_of_double_dice + 1
results[sum] = results[sum] + 1
for x in range (2,13):
print("{0:d} - {1:d}{2:0.4f}%".format(x, results[x], results[x]/count*100))
print("Doubles- {0:d}-{{1:0.6f}%".format(number_of_double_dice, number_of_double_dice*100))
main()
但是,我的代码没有正常工作。有人能告诉我为什么吗?我总是收到ValueError的错误信息。
编辑
我运行程序,得到的结果是:
请输入掷骰次数:10000
2 - 2772.7700%
对子 - 1667 - 166700.0000%
3 - 00.0000%
对子 - 1667 - 166700.0000%
4 - 2502.5000%
对子 - 1667 - 166700.0000%
5 - 00.0000%
对子 - 1667 - 166700.0000%
6 - 2982.9800%
对子 - 1667 - 166700.0000%
7 - 00.0000%
对子 - 1667 - 166700.0000%
8 - 2732.7300%
对子 - 1667 - 166700.0000%
9 - 00.0000%
对子 - 1667 - 166700.0000%
10 - 2782.7800%
对子 - 1667 - 166700.0000%
11 - 00.0000%
对子 - 1667 - 166700.0000%
12 - 2912.9100%
对子 - 1667 - 166700.0000%
这些结果根本和示例输出不一样。我哪里出错了?
4 个回答
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,我们希望程序能做出反应。这种反应通常是通过“事件”来实现的。
事件就像是程序中的信号,告诉它发生了什么事情。比如,用户点击了鼠标、按下了键盘,或者页面加载完成等。这些都是事件。
为了让程序知道这些事件发生了,我们需要“监听”这些事件。监听就像是一个守卫,时刻关注着是否有事件发生。一旦有事件发生,守卫就会立刻通知程序去执行相应的操作。
在代码中,我们通常会用一些特定的方式来设置这些监听器。这样,当事件发生时,程序就能自动响应,而不需要我们手动去检查。
总之,事件和监听器是让程序能够对用户的操作做出反应的重要工具。通过这些工具,我们可以让程序变得更加智能和互动。
import random
def problem2_6():
random.seed(82)
for i in range(100):
k=random.randint(1,6)
for j in range(100):
a=random.randint(1,6)
s=a+k
print(s)
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能在使用某个工具或语言时,碰到了错误或者不明白的地方。这时候,大家会去一个叫StackOverflow的网站上提问,那里有很多热心的程序员会帮忙解答。
在这个网站上,用户可以把自己的问题写出来,其他人就可以看到并给出建议或者解决方案。通常,问题会被分成不同的类别,这样大家可以更容易找到相关的内容。
有时候,提问的人会附上代码块,比如
import random
def roll_two_dice():
return random.randint(1, 6)*2
,这可以帮助别人更好地理解问题所在。通过这些代码,其他人可以看到具体的情况,从而提供更准确的帮助。
这是你代码的一个更好的版本:
import random
num = int(input('How many rolls do you want to simulate? '))
rolls = {}
for k in range(2, 13):
rolls[k] = 0
doubles = 0
for k in range(num):
first = random.randint(1, 6)
second = random.randint(1, 6)
if first == second:
doubles+=1
rolls[first+second]+=1
for k in rolls:
print('%d - %d %f%%' %(k, rolls[k], float(rolls[k])/float(num)*100))
print('Doubles - %d - %f%%' %(doubles, float(doubles)/float(num)))
运行结果是:
How many rolls do you want to simulate? 10000
2 - 286 2.860000%
3 - 571 5.710000%
4 - 788 7.880000%
5 - 1066 10.660000%
6 - 1393 13.930000%
7 - 1731 17.310000%
8 - 1470 14.700000%
9 - 1034 10.340000%
10 - 840 8.400000%
11 - 541 5.410000%
12 - 280 2.800000%
Doubles - 1669 - 0.166900%
你遇到的问题是:只有在出现双数的时候才给总和加一,这就是为什么你只得到了偶数结果。 另外,你的代码中有 {{1:0.6f}%
,其实应该是 {1:0.6f}%
。
要让你的代码正常工作,有四个地方需要修改(除了评论中提到的小错误):
首先,你只有在 first == second
的情况下才给 results[sum]
加 1
。所以,results[sum] = results[sum] + 1
这行代码不应该放在 if 语句
里面:
if(first == second):
number_of_double_dice = number_of_double_dice + 1
results[sum] = results[sum] + 1
其次,有一个原因我还不太清楚,"{0:d} - {1:d}{2:0.4f}%"
这段代码需要改成 "{0:d} - {1:d} {2:0.4f}%"
(注意第二个 }
和第三个 {
之间多了一个空格)。
第三,在计算双倍数的总百分比时,你忘了要用 count
来除一下。所以,应该是:
print("Doubles- {0:d}-{1:0.6f}%".format(number_of_double_dice, number_of_double_dice/count*100))
第四,打印双倍数的那一行代码需要放在 for 语句
外面,因为你只想打印一次,而不是在每次循环的时候都打印:
for x in range (2,13):
print "{0:d} - {1:d} {2:0.4f}%".format(x, results[x], results[x] / count * 100)
print("Doubles- {0:d}-{1:0.6f}%".format(number_of_double_dice, number_of_double_dice / count *100))
所以你的代码应该像 这样: https://gist.github.com/s16h/b4c2bc791880b61418b2。
我快速重写了你的程序,尽量保持你的逻辑和做法:
from __future__ import division
import random
import sys
def dice_roll():
return random.randint(1, 6)
def number_of_rolls():
return int(raw_input('Enter the number of rolls: '))
def simulate(number_of_times):
counter = {n : 0 for n in range(2, 13)}
doubles = 0
for i in range(number_of_times):
first_dice = dice_roll()
second_dice = dice_roll()
total = first_dice + second_dice
doubles += 0 if first_dice != second_dice else 1
counter[total] += 1
return counter, doubles
def main():
rolls = number_of_rolls()
counter, doubles = simulate(rolls)
total = sum(counter.values())
for total, count in counter.items():
print("{} - {} {:0.4f}%".format(total, count, count / rolls * 100))
print("Doubles - {} - {:0.6f}%".format(doubles, doubles / rolls * 100))
if __name__ == '__main__':
sys.exit(main())
希望这能帮到你。