投掷n次骰子,获得至少六分之一的概率是多少

时间:2012-11-10 14:53:15

标签: python-2.7 probability standard-library dice

我有以下代码试图解决以下问题:

投掷骰子m次,计算得到至少一个6的概率。

我知道投掷2个骰子时获得至少1 6的确切概率是11/36。

我的程序似乎希望概率为0.333,这是接近的,但它应该是11/36对吗?

很好,如果建议可以继续我已经制作的标准代码,但矢量化代码也很受欢迎。

import random
from sys import argv

m = int(argv[1]) # performing the experiment with m dice n times
n = int(argv[2]) # Throwing m dice n times
s = 0            # Counts the number of times m dies shows at least one 6

print '%.g dice are thrown %.g times' % (m, n)

for i in xrange(n):
    list = []    # used to clear the list for new die count
    for q in xrange(m):
        r = random.randint(1,6)#Picks a random integer on interval [1,6]
        list.append(r)         #appends integer value
        if len(list) == m:     #when list is full, that is when m dice has been thrown
            for i in xrange(len(list)):
                #print list
                if list[i] == 6: #if the list of elements has a six add to the counter
                    s += 1
                    pass #I want the loop to exit when it finds an element = 6

print 'Number of times one of the n dice show at least one 6: %.g' % s  
print 'Probability of at least 1 six from %.g dice is = %2.3f' % (m,s/float(n))

如果不清楚,我会编辑代码和问题。

输出样本:

Terminal > python one6_ndice.py 2 1000000
2 dice are thrown 1e+06 times
Number of times one of the n dice show atleast one 6: 3e+05
Probability of atleast 1 six from 2 dice is = 0.333

2 个答案:

答案 0 :(得分:1)

我认为问题在于:

 pass #I want the loop to exit when it finds an element = 6

pass不会退出循环。 pass是无操作命令;它什么都不做。您可能需要break(退出循环)。

顺便说一句,不要打电话给你的列表list - 这会破坏内置list

对于更紧凑的表达式,您可以考虑

sum(any(random.randint(1,6) == 6 for die in xrange(n)) for trial in xrange(m))

sum(6 in (random.randint(1,6) for die in range(n)) for trial in range(m))

答案 1 :(得分:1)

您不必在列表上循环以检查其长度。只需喂它并检查它是否在其中:

for i in xrange(n):
    list = []
    for q in xrange(m):
        r = random.randint(1, 6)
        list.append(r)
    if 6 in list:
        s += 1

如果您希望自己的程序更紧凑,并且每次都不想提供列表,那么当您获得“6”时,可以使用break停止生成:

for i in xrange(n):
    for q in xrange(m):
        if random.randint(1, 6) == 6:
            s += 1
            break