1、起因:
团建要拍合照,照了很多张,很难有理想的照片。总有人闭眼或者状态不佳。就想有这么多人一起拍照,如何确定随机抓拍一张照片,废片率的概率有多高?
2、问题提出:
n个人拍照,随机抓拍一张,多大概率能拍的一张大家都睁眼的照片?
3、解决思路:
这应该是个概率论问题,因为数学太差,打算用程序模拟的方式算的大致结果,因为程序能力太差,用了效率最低的数组解决这个问题。个人的时间序列作为一个数组,在这个时间序列中随机选取12个点作为眨眼时机,持续0.25s,最后将所有人的数组整合到一起成为所有人眨眼的数组,寻找其中没有人眨眼的时间占比。
4、参数设定:
拍照时间为0.02s,以一分钟的抓拍作为标准,每个人每分钟眨眼12次,每次持续0.25s。
5、程序实现:
① 创建一个个人是否眨眼的时间序列
#产出时间序列,一分钟切分为60000帧,每人的眨眼随机分布,假设一分钟眨眼12次,每次0.25秒
def create():
a = [0 for i in range(60000)]
c = []
for i in range(12):
b = random.randint(1,59750)
c.append(b)
for i in c:
for j in range(250):
a[int(i)+int(j)] =1
return [a]
② 设定合照人数25,每个人产生一个眨眼数组存在num中,然后将这些数组加总合成整体的时间序列数组。
num = []
member =25#设定拍照人数
for i in range(member):
num.extend(create())
#整合时间帧
sum = [0 for i in range(60000)]
for i in range(60000):
for j in range(member):
sum[i] += num[j][i]
③ 拍照时间为0.02s,去找整合时间序列数组中的持续0.02s没有闭眼的帧数,对比持续时间帧算的废片率。
#计算废片率count = 0
for i in range(59750):
if sum[i] == 0 and sum[i+20] == 0:
count +=1
print("废片率")
print(1-count/60000)
6、结论:
25个人拍照,假设每人眨眼每分钟12次,每次0.25s,拍照时间为0.02s,废片率大概有73%。假如光线比较暗,快门速度更慢,会导致废片率更高,假如眨眼频率和时间增加,也会导致废片率增加。假如人数更多,就像是大家一起拍毕业照的情况,情况就更糟糕,100人一起拍照,基本找不到大家全部睁眼的照片了。但是现实中人们是怎么解决这个问题的呢?大家会一起叫:茄子~然后瞪大了眼睛看相机。规则带来了秩序。
7、局限:
①pandas效率更高,而不是数组;②程序中用了random在一分钟内随机取了12个位置眨眼,但现实中应该眨眼是存在一定的规律,程序和现实存在一定的误差;③该程序定义的可用照片为大家都睁眼,但是闭眼是一个过程,90%以上的眨眼也许也能作为一种睁眼状态(只不过是眼睛显得比较小~),程序中的改进可以在计算废片率中重新计算一下sum[i]的规则。