这是不是很不可能?或者这是不可能的



所以,我是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%(的情况下,让rods更有可能超过211(仍然是一个非常不可能的结果,ofc(吗?

random.seed(seed)有用吗?

棒的概率分布是二项式(305,0.5(,也就是说,精确得到n个棒的概率是(305选择n(*0.5^305。

为了得到至少211的概率,你需要将这些项从211到305求和。Wolfram-alpha给出了8.8e-12。

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

如果我没记错的话,Youtube频道Stand-up Maths的Matt Parker在他的视频";真是太幸运了";。

正如Jens所指出的,这很容易通过二项式分布进行计算。SciPy统计模块允许您通过以下操作进行计算:

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模块将此数字转换为您必须等待的预期时间:

from datetime import timedelta
time_per_try = timedelta(seconds=1/1000)
print(time_per_try / p)

这应该会给你大约1300天,或者3.6年的时间。从技术上讲,这是你必须等待的时候,才能有50%的机会看到它,而且它迟早会出现。

您可以使用负二项式分布来计算何时会发生这种情况的合理值。在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年以上。

相关内容

最新更新