找回密码
 欢迎注册
查看: 24238|回复: 1

[转载] 看到了一道神奇的问题

[复制链接]
发表于 2019-5-23 00:36:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
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)
  1. from itertools import permutations as perm
  2. OK=0
  3. def test(speed,time):
  4.   if max(speed)==speed[0]:return False # speed[0](第一颗子弹)速度最快
  5.   if len(speed)<=2 : return True       # 如果只剩两颗子弹且第一颗子弹速度不是最快的。
  6.   t=[float("inf")]                     # 做标记,这样如果t.index(min(t))==0,我们就知道,这种情况不可行。
  7.   for i in range(1,len(speed)):        # 计算相邻两颗子弹相遇时间,time=0为第一发子弹出发时间。
  8.     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"))
  9.   ind=t.index(min(t))                  # 下面用del speed[ind-1:ind+1]切掉speed的第ind-1与第ind个元素
  10.   if ind==0: return False              # 如果t.index(min(t))==0,我们就知道,这种情况不可行。
  11.   del speed[(ind-1):(ind+1)]
  12.   del time[(ind-1):(ind+1)]
  13.   return test(speed,time)

  14. for i in perm([0.6,0.7,0.81,0.93,0.96,0.97]):
  15.   OK+=test([i for i in i],[0,1,2,3,4,5])

  16. OK/24
复制代码

发现似乎没问题,虽然如果加debug会在更改perm里面的参数(也就是几颗子弹的速度)的时候,汇报OK的结果会有所不同(有些permutation并不会一直返回True或False,而是会根据输入数据发生改变,哪怕我是按顺序输入数据的。)
比较好奇,究竟是什么保证了像(1*3*5*7*...*2n-1)/(2*4*6*8*...*2n)这样神奇的结果
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2020-5-26 14:51:02 | 显示全部楼层
“比较好奇,究竟是什么保证了像(1*3*5*7*...*2n-1)/(2*4*6*8*...*2n)这样神奇的结果”

这个问题的根源是子弹速度同分布,也就是说:
123.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-9-28 11:19 , Processed in 0.026041 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表