【问题标题】:Calculating the different outcomes for 2 to 6 different dices计算 2 到 6 个不同骰子的不同结果
【发布时间】:2020-08-31 16:13:45
【问题描述】:

更新代码 我知道我的编程很垃圾,但我对此很陌生。对不起,如果它看起来很碍眼。 我必须计算 2 个骰子到 6 个骰子之和的相对频率。到目前为止,我认为我应该得到正确的答案,但打印的结果不正确。

我不知道真正的问题是什么......

请帮忙!谢谢!

#d2_3 = 2 dices with the sum of 3


d2_2= 0
d2_3, d3_3= 0, 0
d2_4, d3_4, d4_4= 0, 0, 0
d2_5, d3_5, d4_5, d5_5= 0, 0, 0, 0
d2_6, d3_6, d4_6, d5_6, d6_6 = 0, 0, 0, 0, 0
d2_7, d3_7, d4_7, d5_7, d6_7 = 0, 0, 0, 0, 0
d2_8, d3_8, d4_8, d5_8, d6_8 = 0, 0, 0, 0, 0
d2_9, d3_9, d4_9, d5_9, d6_9 = 0, 0, 0, 0, 0
d2_10, d3_10, d4_10, d5_10, d6_10 = 0, 0, 0, 0, 0
d2_11, d3_11, d4_11, d5_11, d6_11 = 0, 0, 0, 0, 0
d2_12, d3_12, d4_12, d5_12, d6_12 = 0, 0, 0, 0, 0
d3_13, d4_13, d5_13, d6_13 = 0, 0, 0, 0
d3_14, d4_14, d5_14, d6_14 = 0, 0, 0, 0
d3_15, d4_15, d5_15, d6_15 = 0, 0, 0, 0
d3_16, d4_16, d5_16, d6_16 = 0, 0, 0, 0
d3_17, d4_17, d5_17, d6_17 = 0, 0, 0, 0
d3_18, d4_18, d5_18, d6_18 = 0, 0, 0, 0
d4_19, d5_19, d6_19 = 0, 0, 0
d4_20, d5_20, d6_20 = 0, 0, 0
d4_21, d5_21, d6_21 = 0, 0, 0
d4_22, d5_22, d6_22 = 0, 0, 0
d4_23, d5_23, d6_23 = 0, 0, 0
d4_24, d5_24, d6_24 = 0, 0, 0
d5_25, d6_25 = 0, 0
d5_26, d6_26 = 0, 0
d5_27, d6_27 = 0, 0
d5_28, d6_28 = 0, 0
d5_29, d6_29 = 0, 0
d5_30, d6_30 = 0, 0
d6_31 = 0
d6_32 = 0
d6_33 = 0
d6_34 = 0
d6_35 = 0
d6_36 = 0

for i in range(0, 100001):

    dice01 = random.randint(1, 6)
    dice02 = random.randint(1, 6)
    dice03 = random.randint(1, 6)
    dice04 = random.randint(1, 6)
    dice05 = random.randint(1, 6)
    dice06 = random.randint(1, 6)

    d2 = dice01 + dice02
    d3 = dice01 + dice02 + dice03
    d4 = dice01 + dice02 + dice03 + dice04
    d5 = dice01 + dice02 + dice03 + dice04 + dice05
    d6 = dice01 + dice02 + dice03 + dice04 + dice05 + dice06


    if [d2] == [2]:
        d2_2 = d2_2 +1
    if [d2, d3] == [3, 3]:
        d2_3, d3_3 = d2_3 +1, d3_3 +1
    if [d2, d3, d4] == [4, 4, 4]:
        d2_4, d3_4, d4_4 = d2_4 +1, d3_4 +1, d4_4 +1
    if [d2, d3, d4, d5] == [5, 5, 5, 5]:
        d2_5, d3_5, d4_5, d5_5 = d2_5 +1, d3_5 +1, d4_5 +1, d5_5 +1
    if [d2, d3, d4, d5, d6] == [6, 6, 6, 6, 6]:
        d2_6, d3_6, d4_6, d5_6, d6_6 = d2_6 +1, d3_6 +1, d4_6 +1, d5_6 +1, d6_6 +1
    if [d2, d3, d4, d5, d6] == [7, 7, 7, 7, 7]:
        d2_7, d3_7, d4_7, d5_7, d6_7 = d2_7 +1, d3_7 +1, d4_7 +1, d5_7 +1, d6_7 +1
    if [d2, d3, d4, d5, d6] == [8, 8, 8, 8, 8]:
        d2_8, d3_8, d4_8, d5_8, d6_8 = d2_8 +1, d3_8 +1, d4_8 +1, d5_8 +1, d6_8 +1
    if [d2, d3, d4, d5, d6] == [9, 9, 9, 9, 9]:
        d2_9, d3_9, d4_9, d5_9, d6_9 = d2_9 +1, d3_9 +1, d4_9 +1, d5_9 +1, d6_9 +1
    if [d2, d3, d4, d5, d6] == [10, 10, 10, 10, 10]:
        d2_10, d3_10, d4_10, d5_10, d6_10 = d2_10 +1, d3_10 +1, d4_10 +1, d5_10 +1, d6_10 +1
    if [d2, d3, d4, d5, d6] == [11, 11, 11, 11, 11]:
        d2_11, d3_11, d4_11, d5_11, d6_11 = d2_11 +1, d3_11 +1, d4_11 +1, d5_11 +1, d6_11 +1
    if [d2, d3, d4, d5, d6] == [12, 12, 12, 12, 12]:
        d2_12, d3_12, d4_12, d5_12, d6_12 = d2_12 +1, d3_12 +1, d4_12 +1, d5_12 +1, d6_12 +1
    if [d3, d4, d5, d6] == [13, 13, 13, 13]:
        d3_13, d4_13, d5_13, d6_13 = d3_13 +1, d4_13 +1, d5_13 +1, d6_13 +1
    if [d3, d4, d5, d6] == [14, 14, 14, 14]:
        d3_14, d4_14, d5_14, d6_14 = d3_14 +1, d4_14 +1, d5_14 +1, d6_14 +1
    if [d3, d4, d5, d6] == [15, 15, 15, 15]:
        d3_15, d4_15, d5_15, d6_15 = d3_15 +1, d4_15 +1, d5_15 +1, d6_15 +1
    if [d3, d4, d5, d6] == [16, 16, 16, 16]:
        d3_16, d4_16, d5_16, d6_16 = d3_16 +1, d4_16 +1, d5_16 +1, d6_16 +1
    if [d3, d4, d5, d6] == [17, 17, 17, 17]:
        d3_17, d4_17, d5_17, d6_17 = d3_17 +1, d4_17 +1, d5_17 +1, d6_17 +1
    if [d3, d4, d5, d6] == [18, 18, 18, 18]:
        d3_18, d4_18, d5_18, d6_18 = d3_18 +1, d4_18 +1, d5_18 +1, d6_18 +1
    if [d4, d5, d6] == [19, 19, 19]:
        d4_19, d5_19, d6_19 = d4_19 +1, d5_19 +1, d6_19 +1
    if [d4, d5, d6] == [20, 20, 20]:
        d4_20, d5_20, d6_20 = d4_20 +1, d5_20 +1, d6_20 +1
    if [d4, d5, d6] == [21, 21, 21]:
        d4_21, d5_21, d6_21 = d4_21 +1, d5_21 +1, d6_21 +1
    if [d4, d5, d6] == [22, 22, 22]:
        d4_22, d5_22, d6_22 = d4_22 +1, d5_22 +1, d6_22 +1
    if [d4, d5, d6] == [23, 23, 23]:
        d4_23, d5_23, d6_23 = d4_23 +1, d5_23 +1, d6_23 +1
    if [d4, d5, d6] == [24, 24, 24]:
        d4_24, d5_24, d6_24 = d4_24 +1, d5_24 +1, d6_24 +1
    if [d5, d6] == [25, 25]:
        d5_25, d6_25 = d5_25 +1, d6_25 +1
    if [d5, d6] == [26, 26]:
        d5_26, d6_26 = d5_26 +1, d6_26 +1
    if [d5, d6] == [27, 27]:
        d5_27, d6_27 = d5_27 +1, d6_27 +1
    if [d5, d6] == [28, 28]:
        d5_28, d6_28 = d5_28 +1, d6_28 +1
    if [d5, d6] == [29, 29]:
        d5_29, d6_29 = d5_29 +1, d6_29 +1
    if [d5, d6] == [30, 30]:
        d5_30, d6_30 = d5_30 +1, d6_30 +1
    if [d6] == [31]:
        d6_31 = d6_31 +1
    if [d6] == [32]:
        d6_32 = d6_32 +1
    if [d6] == [33]:
        d6_33 = d6_33 +1
    if [d6] == [34]:
        d6_34 = d6_34 +1
    if [d6] == [35]:
        d6_35 = d6_35 +1
    if [d6] == [36]:
        d6_36 = d6_36 +1

print("summa_utfall for 2 tärningar:", "2:",d2_2, " 3:",d2_3," 4:", d2_4," 5:", d2_5," 6:", d2_6," 7:", d2_7," 8:", d2_8," 9:", d2_9," 10:", d2_10," 11:", d2_11," 12:", d2_12)
print("summa_utfall for 3 tärningar:", "3:",d3_3, " 4:",d3_4, " 5:",d3_5, " 6:",d3_6, " 7:",d3_7, " 8:",d3_8, " 9:",d3_9, " 10:",d3_10, " 11:",d3_11, " 12:",d3_12, " 13:",d3_13, " 14:",d3_14, " 15:",d3_15, " 16:",d3_16, " 17:",d3_17, " 18:",d3_18)
print("summa_utfall for 4 tärningar:", "4:",d4_4, " 5:", d4_5," 6:", d4_6," 7:", d4_7," 8:", d4_8," 9:", d4_9," 10:", d4_10," 11:", d4_11," 12:", d4_12," 13:", d4_13," 14:", d4_14," 15:", d4_15," 16:", d4_16," 17:", d4_17," 18:", d4_18," 19:", d4_19," 20:", d4_20," 21:", d4_21," 22:", d4_22," 23:", d4_23," 24:", d4_24)
print("summa_utfall for 5 tärningar:", "5:",d5_5, " 6:",d5_6, " 7:",d5_7, " 8:",d5_8, " 9:",d5_9, " 10:",d5_10, " 11:",d5_11, " 12:",d5_12, " 13:",d5_13, " 14:",d5_14, " 15:",d5_15, " 16:",d5_16, " 17:",d5_17, " 18:",d5_18, " 19:",d5_19, " 20:",d5_20, " 21:",d5_21, " 22:",d5_22, " 23:",d5_23, " 24:",d5_24, " 25:",d5_25, " 26:",d5_26, " 27:",d5_27, " 28:",d5_28, " 29:",d5_29, " 30:",d5_30)
print("summa_utfall for 6 tärningar:", "6.",d6_6, " 7:",d6_7, " 8:",d6_8, " 9:",d6_9, " 10:",d6_10, " 11:",d6_11, " 12:",d6_12, " 13:",d6_13, " 14:",d6_14, " 15:",d6_15, " 16:",d6_16, " 17:",d6_17, " 18:",d6_18, " 19:",d6_19, " 20:",d6_20, " 21:",d6_21, " 22:",d6_22, " 23:",d6_23, " 24:",d6_24, " 25:",d6_25, " 26:",d6_26, " 27:",d6_27, " 28:",d6_28, " 29:",d6_29, " 30:",d6_30, " 31:",d6_31, " 32:",d6_32, " 33:",d6_33, " 34:",d6_34, " 35:",d6_35, " 36:",d6_36)


【问题讨论】:

  • 如果 d2(2 个骰子的随机总和)等于某个整数 - 我的 if 条件将计算 100000 次掷骰中 d2 等于该特定整数的次数。
  • @AmitaIrron 向下滚动。
  • 任何时候你发现自己创建了很多带有数字后缀的类似变量,你可能应该使用一个列表。
  • 你为什么要把骰子的总和放在列表中?
  • 但是你真的需要想出一个更好的方法来做到这一点,使用循环和列表,而不是几十个不同的变量。您必须了解结构化数据,例如列表和字典。

标签: python probability dice die


【解决方案1】:

以下是处理 2 个骰子的方法:

>>> import itertools
>>> list(itertools.product(range(6), range(6)))
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]

将第一个和第二个骰子的值相加:

>>> outcomes = list(itertools.product(range(6), range(6)))
>>> sums = [a+b for a,b in outcomes]
>>> sums
[0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 10]

现在我们可以计算每个结果发生了多少次:

>>> from collections import Counter
>>> Counter(sums)
Counter({5: 6, 4: 5, 6: 5, 3: 4, 7: 4, 2: 3, 8: 3, 1: 2, 9: 2, 0: 1, 10: 1})

一些小提示:

  1. 如果您希望掷骰子的结果在“1..6”范围内而不是(当前)“0..5”,请将range(6) 替换为range(1,7)

    李>
  2. 对于更多的骰子,您可能需要使用[sum(vals) for vals in outcomes]计算总和

【讨论】:

    【解决方案2】:

    这是一种使用递归的方法,最多可掷出 11 个骰子。 11 似乎是我的计算机在合理的时间内给出结果的实际限制。

    它在 15 分钟内计算了 12 个骰子(2,176,782,336 种组合)的掷骰数。根据您可用的计算能力,您可能可以滚动更多。

    # recursive function to roll the dice and store 
    # how many times each result is rolled.
    def roll(dice, current_num=0):
        if dice == 0:
            freq[current_num] += 1
            return
        dice -= 1
        for num_rolled in range(1, 7):
            roll(dice, current_num + num_rolled)
    
    
    num_dice = 2
    max_score = num_dice * 6
    combinations = 6 ** num_dice
    
    print(num_dice)
    print(combinations)
    
    # what are all the possible results?
    results = [x for x in range(num_dice, max_score+1)]
    
    # create a dictionary to store frequency count
    freq = dict.fromkeys(results, 0)  
    
    roll(num_dice)
    
    print(freq)  # print out how many time each result could be rolled.
    
    # work out the probability of each score
    for k, f in freq.items():
        print('{}: {:.6%}'.format(k, f / combinations))
    

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2018-03-11
      • 2013-09-17
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多