【问题标题】:Monte Carlo simulation of N diceN个骰子的蒙特卡罗模拟
【发布时间】:2020-03-19 15:30:15
【问题描述】:

我正在做这个任务:

你在掷N 骰子。用 Python 编写一个程序,计算总和大于3N/2 且小于9N/2 的概率。

我以为我只有 3 个骰子,因为用 N 骰子制作有点复杂,我尝试了一些方法,但我不明白如何找到 9N/2 > sum > 3N/2 的概率

import random
num_throws = 20  # NT
roll_log = [0] * 12  # Generate list for dice roll tallies

for i in range(num_throws):
    # Random integer between 1 and 6 inclusive for each dice
    dice_1 = random.randint(1, 6)
    dice_2 = random.randint(1, 6)
    dice_3 = random.randint(1, 6)

    # Sum the random dice and increment the tally for that particular roll total
    roll_sum = dice_1 + dice_2
    roll_log[roll_sum-1] += 1  # minus 1 because Python is 0-indexed

    for i, tally in enumerate(roll_log):
        roll_prob = float(tally) / num_throws  # Experimental probability of roll
        roll = i + 1  # Since Python lists are 0-indexed
        print('{}: {}/{} = {}'.format(roll, tally, num_throws, roll_prob))
        n = 5
        m = 10

rolls_between = roll_log[n:m-1]  
sum_rolls_between = sum(rolls_between)  
prob_between = float(sum_rolls_between) / num_throws

【问题讨论】:

  • 统计计算与伪随机方法的结合难道不是糟糕的家庭作业的组成部分吗..? ;)
  • @iLuvLogix 是的,但我能做什么?
  • 赋值语句已经很混乱了:'Python中的概率是多少'应该是:'用Python写一个程序来计算..根据...'
  • @iLuvLogix 老师的错,我现在已经编辑了问题。
  • 通过使用“仅 3 个骰子”,您使问题变得比它需要的更复杂。程序应该很简单: (1) 用 0 初始化 sum; (2)N次,从1到6中选择一个随机数,加到总和中; (3) 将总和与 3N/2 和 9N/2 进行比较; (4) 多次重复步骤1-3,计算总和大于3N/2小于9N/2的频率

标签: python montecarlo


【解决方案1】:

我修正了第一个答案...不知道是否正确... 刚刚修复了明显的错误...

import random                                                                                       

N = 3                                                                                               
NUM_ROLLS = 10000                                                                                   
UPPER_BOUND = 9 * N / 2                                                                             
LOWER_BOUND = 3 * N / 2                                                                             

counter = 0                                                                                         
for _ in range(NUM_ROLLS):                                                                          
  s = sum([random.randint(1, 6) for _ in range(N)])                                                 
  if s < UPPER_BOUND and s > LOWER_BOUND:                                                           
    counter += 1                                                                                    

prob = 1.0 * counter / NUM_ROLLS                                                                    
print "Upper Bound = ", UPPER_BOUND                                                                 
print "Lower Bound = ", LOWER_BOUND                                                                 
print prob                                                                                          

【讨论】:

  • 注意:我使用的是 Python 2.7.16
  • 顺便说一下,骰子的数量越多,得到1的概率就越大
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多