【问题标题】:find the distribution of dice rolls找到掷骰子的分布
【发布时间】:2014-11-10 22:18:30
【问题描述】:

编写一个名为distribution_of_rolls 的函数,它接受一个数字—— 掷两个骰子的次数 - 并以如下所示的形式打印这些掷骰的值的分布。
例如:

    Distribution of dice rolls

    2:     7 ( 3.5%)  *******
    3:    14 ( 7.0%)  **************
    4:    15 ( 7.5%)  ***************
    5:    19 ( 9.5%)  *******************
    6:    24 (12.0%)  ************************
    7:    35 (17.5%)  ***********************************
    8:    24 (12.0%)  ************************
    9:    28 (14.0%)  ****************************
   10:    18 ( 9.0%)  ******************
   11:     9 ( 4.5%)  *********
   12:     7 ( 3.5%)  *******
   -----------------------------
         200 rolls

我的代码在某处是错误的。无法打印出来。

def roll():
        return randrange(1,7) + randrange(1,7)

def distribution_of_rolls(n:int):
        result=({i,0} for i in range(2,13,1))
        c=''
        result=list(result)
        for i in range(n):
              a = roll()
              print(a)
              result[a]= result[a] + 1
              print(result)
        for i in range(2,13,1):
            b=(result[i]/float(n)) * 100
        for i in range(int(math.floor(n))):
            c = c + '*'
            d = "{0:0.1f}%".format(b)
        print("{0:2d}:   {1:5d} ({2:s})  {3:s}".format(i, result[i], d, c)
        print("-------------------------")
        print("{0:10d} rolls".format(n))


    distribution_of_rolls(20)

【问题讨论】:

  • 您可能想要result = {i: 0 for i in range(2, 13)},或者将您当前的通话包含在dict(...) 中。现在,result 是一个生成器,这可能是您(未公开)问题的原因。如果您想要比这更好,您需要告诉我们实际出了什么问题。

标签: python python-3.4


【解决方案1】:

在概率建模中,您可以使用特征函数计算独立定律的总和。即使有 50 个骰子,在我使用 OpenTurns 平台的计算机上也是瞬间完成的。

import openturns as ot
d = 2 #number of dice

#define dice distribution with possible values: 1, 2, 3, 4, 5, 6
dice_distribution = ot.UserDefined([[i] for i in range(1,7)]) 

# create same distribution d times then sum
sum_distribution = sum([dice_distribution] * d) 

# create a sample of size 200
Sample = sum_distribution.getSample(200) 

如果你想计算每个实现:

import numpy as np
unique, counts = np.unique(Sample, return_counts = True)
print(unique)
print(counts/200) # frequency
>>>[ 2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
   [0.05  0.05  0.09  0.115 0.13  0.175 0.125 0.115 0.07  0.04  0.04 ]

您还可以使用 OpenTurns 查看器绘制概率密度函数 (PDF):

import openturns.viewer as otv 
graph = sum_distribution.drawPDF()
otv.View(graph)

您还可以检索值:

print(sum_distribution)
>>> UserDefined(
     {x = [2], p = 0.0277778},
     {x = [3], p = 0.0555556},
     {x = [4], p = 0.0833333},
     {x = [5], p = 0.111111},
     {x = [6], p = 0.138889},
     {x = [7], p = 0.166667},
     {x = [8], p = 0.138889},
     {x = [9], p = 0.111111},
     {x = [10], p = 0.0833333},
     {x = [11], p = 0.0555556},
     {x = [12], p = 0.0277778}
   )

使用 d = 50 dice,密度将更像高斯分布:

【讨论】:

    【解决方案2】:

    使用更多的功能,让调试变得更容易。例如,

    def roll():
      return random.randrange(1,7) + random.randrange(1,7)
    
    def create_data(nrolls):
      data = collections.defaultdict(int)
      for _ in range(nrolls):
        data[roll()] += 1
      return data
    
    fmtstart = "{dsum:>2}:{count:>6} ({pct:4.1f}%)"
    
    def format_data(data):
      result = []
      total = float( sum(data.values()) )
      tuples = sorted( data.items() )
      for k,v in tuples:
        start = fmtstart.format(dsum=k,count=v,pct=100*v/total)
        end = " " + "*"*v
        result.append(start + end)
      return "\n".join(result)
    
    print( format_data( create_data(200) ) )
    

    【讨论】:

      【解决方案3】:
      from random import randrange
      
      def roll():
              return randrange(1,7) + randrange(1,7)
      
      def distribution_of_rolls(n:int):
          results = {i:0 for i in range(2,13)}
          for i in range(n):
              results[roll()] += 1
          for i in range(2,13):
              occurrences = results[i]
              percentage = (occurrences/float(n)) * 100
              bar = occurrences * "*"
              print("{0:2d}: {1:5d} ({2:4.1f}%)  {3:s}".format(i, occurrences, percentage, bar))
          print("-------------------------")
          print("{0:9d} rolls".format(n))
      
      
      distribution_of_rolls(200)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 2012-02-29
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多