- 注册时间
- 2017-12-7
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 3243
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
https://www.zhihu.com/question/25339267
沿着同一方向每隔1s射出一颗子弹,子弹的速度服从0到1之间的均匀随机分布。当任意两颗子弹相遇后,这两颗子弹便消失。问射击2n发子弹后,最终所有子弹消失的概率。结果为(1*3*5*7*...*2n-1)/(2*4*6*8*...*2n)。求证明过程
这个话题下给了一堆不知所云但work的方案……我仔细看了看,如果work,那么,这道题其实跟分布没关系,只要子弹速度是正数,服从什么连续分布都没关系——甚至说,服从某几个速度的置换也是可以的:
于是我写了一个n=4时候的验证程序(python 3)
- from itertools import permutations as perm
- OK=0
- def test(speed,time):
- if max(speed)==speed[0]:return False # speed[0](第一颗子弹)速度最快
- if len(speed)<=2 : return True # 如果只剩两颗子弹且第一颗子弹速度不是最快的。
- t=[float("inf")] # 做标记,这样如果t.index(min(t))==0,我们就知道,这种情况不可行。
- for i in range(1,len(speed)): # 计算相邻两颗子弹相遇时间,time=0为第一发子弹出发时间。
- t.append( (time[i]-time[i-1])*speed[i-1]/(speed[i]-speed[i-1])+time[i] if speed[i]>speed[i-1] else float("inf"))
- ind=t.index(min(t)) # 下面用del speed[ind-1:ind+1]切掉speed的第ind-1与第ind个元素
- if ind==0: return False # 如果t.index(min(t))==0,我们就知道,这种情况不可行。
- del speed[(ind-1):(ind+1)]
- del time[(ind-1):(ind+1)]
- return test(speed,time)
- for i in perm([0.6,0.7,0.81,0.93,0.96,0.97]):
- OK+=test([i for i in i],[0,1,2,3,4,5])
- OK/24
复制代码
发现似乎没问题,虽然如果加debug会在更改perm里面的参数(也就是几颗子弹的速度)的时候,汇报OK的结果会有所不同(有些permutation并不会一直返回True或False,而是会根据输入数据发生改变,哪怕我是按顺序输入数据的。)
比较好奇,究竟是什么保证了像(1*3*5*7*...*2n-1)/(2*4*6*8*...*2n)这样神奇的结果 |
|