Python 掷两个骰子并将结果制成表格

Python 掷两个骰子并将结果制成表格,python,random,Python,Random,问题是: 您将编写一个程序来模拟一对骰子的滚动 您将要求用户输入要模拟的转鼓数。然后你将掷两个骰子。对每个骰子使用随机库和其中的randint函数(random.randint(1,6)) 将每个骰子上的数字相加,并记下每个可能的掷骰次数(2-12),以及你掷“双倍”的次数(两个骰子上的数字相同) 打印出每个骰子计数、该骰子计数的卷数以及占总数的百分比: 样本输出 输入卷数:10000 2-266 2.660000% 3-580 5.800000% 4-88181000% 5-10861080

问题是:

您将编写一个程序来模拟一对骰子的滚动

  • 您将要求用户输入要模拟的转鼓数。然后你将掷两个骰子。对每个骰子使用随机库和其中的randint函数(random.randint(1,6))

  • 将每个骰子上的数字相加,并记下每个可能的掷骰次数(2-12),以及你掷“双倍”的次数(两个骰子上的数字相同)

  • 打印出每个骰子计数、该骰子计数的卷数以及占总数的百分比:

    样本输出

    输入卷数:10000

    2-266 2.660000%

    3-580 5.800000%

    4-88181000%

    5-10861080000%

    6-1418180000%

    7-165816580000%

    8-1363 13.630000%

    9-10961096000%

    10-829 8.290000%

    11-550 5.500000%

    12-2732730000%

    双打-1425-1434000%

这是我的密码:

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()
但是,我的代码不起作用。谁能告诉我为什么?我不断收到错误信息

编辑 我运行了这个程序,下面是我得到的: 输入卷数: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项更改(注释中已经提到的小错误除外):

首先,如果
第一次==第二次
,则仅将
1
添加到
结果[sum]
。因此,
results[sum]=results[sum]+1
不应在
if语句下

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 / count *100))
其次,由于某种原因,我还不知道是什么,
“{0:d}-{1:d}{2:0.4f}%”
应该改为
“{0:d}-{1:d}{2:0.4f}%
(注意第二个
}
和第三个
{/code>之间增加了空格)

第三在计算双打总数的百分比时,您忘记了除以
计数
。因此,它应该是:

print("Doubles- {0:d}-{1:0.6f}%".format(number_of_double_dice,       number_of_double_dice/count*100))
第四个,打印双倍数的行需要放在语句
之外,因为您只想打印一次;而不是在语句
的每次迭代中:

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 / count *100))
所以你的代码应该是这样的

我很快重新编写了您的程序;我试图保持您的逻辑和做事方式:

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())

我希望这会有所帮助。

这里有一个更好的代码版本:

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}%

双开括号{1:0.6f}%应该是单个。在哪里引发了
ValueError
错误?还有对
main()的调用
将引发一个
名称错误
,除非您实际定义了它。即使使用该修复程序,仍然会给我相同格式的结果,尽管由于随机库的原因,结果的数字不同。打印双倍数不应出现在
for语句中
;您只希望在最后打印一次;而不是在每次迭代中在语句的
中。通常,列表不是最好的(即可读性最好)表示此问题的方式;我认为字典更适合。该程序有效。你的和我的之间有什么区别?我的意思是,我没有做的和你一样正确吗?数学似乎不正确。例如,如果我输入一个卷作为输入,它将为我提供两个卷的数据。最好使用,而不是使用。“你也乘以100而不是除以100"?您也在乘以
100
;这是正确的。您能发布完整的回溯吗?欢迎使用堆栈溢出!仅使用代码的答案没有特别的帮助。请添加一些关于此代码如何解决问题的说明。请确保您共享的代码是正确的。此代码将生成
缩进错误
。To进一步阐述@Shree的观点,将公认的答案作为一个很好的例子,说明需要提供的解释水平。
import random
def roll_two_dice():   
    return random.randint(1, 6)*2