所以,我是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年以上。