这不太可能吗?还是不可能

2024-10-04 07:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我是python的初学者(实际上是一般的编码),我尝试过制作这个小程序,它在305次尝试中生成一个随机数rods

import random
rods = 0
def blazerods():
    global rods
    seed = random.randint(0, 100000000000)
    random.seed(seed)
    i = 0
    rods = 0
    for i in range(0, 305):
        rnd = random.random()
        if rnd < 0.50:
            rods += 1
    print(rods)
    return rods


while 1==1:
    blazerods()
    if rods >= 211:
        break

目标是获得211根或更多的杆。然而,我运行了30分钟的程序没有结果

我的问题是:仅仅使用我包含的这段代码就有可能得到211或更高

我是否可以在不改变概率(50%)的情况下,使杆的长度更可能超过211(这仍然是一个非常不可能的结果,ofc)

{}有用吗


Tags: inimport程序编码forifdefrandom
2条回答

杆的概率分布是二项式的(305,0.5),也就是说,精确获得n根杆的概率是(305选择n)*0.5^305

要获得至少211的概率,需要将这些项从211相加到305Wolfram alpha表示为8.8e-12

所以。。。这是真的,真的不太可能,你将不得不等待很长时间。 如果你的环每秒运行1000次,你将期望大约每4年有足够的棒

如果我没记错的话,Youtube频道《站立数学》的马特·帕克(Matt Parker)在他的视频"How lucky is too lucky"中谈到了这个特殊的案例

正如Jens所指出的,这很容易通过Binomial distribution进行计算。SciPy stats module允许您通过执行以下操作来计算:

from scipy import stats

# i.e. 305 draws with equal probability
d = stats.binom(305, 0.5)

# the probability of seeing something greater than this value
p = d.sf(210)

这应该给你和Jens一样的价值:~8.8e-12

接下来,我们可以使用datetime模块将此数字转换为您必须等待的expected时间:

from datetime import timedelta

time_per_try = timedelta(seconds=1/1000)

print(time_per_try / p)

这将给你1300天或3.6年的时间。从技术上讲,这是你必须等待的时间,以有50%的机会看到它,它可能会出现早或晚

您可以使用negative binomial distribution计算发生这种情况时的合理值。在Python中,这看起来像:

for q in stats.nbinom(1, p).ppf([0.025, 0.975]):
    print(time_per_try * q)

其中,0.025和0.975的值给出了科学家们谈论的95%置信区间

它告诉你,如果你有20台计算机并行运行你的算法,每台计算机每秒进行1000次测试,你可以预期第一台计算机将在大约一个月内完成,而最慢的一台可能会持续10年以上

相关问题 更多 >