学数学的好处(记一次概率论的应用)

756 阅读1分钟

今天上午,和往常一样开开心心的从别处找一个功能相似的代码。复制粘贴正准备干的时候,忽然感觉这段代码有些诡异,遂细细的看了看,更越觉得不对了。

这段代码大概长这样。

# 这里有两个列表,每个列表有一些元素
s1 = []
s2 = []

# 这里有个函数,做了些什么
def func(a, b):
    if b in s1 and a not in s1:
        return b
    if a in s1:
        return a
    if b in s2 and a not in s2:
        return b
    return a

是不是大家也觉得这个代码有问题。

直觉上感觉这里的if可以简化下,但不知道怎么简化。想到最近刚学了点概率论,这里好像可以用一下。

先定义四个事件

A = {a in s1}

B = {b in s1}

C = {第一个return return b}

D = {第二个return return a}

然后,将上面的代码转成数学表达式

b in s1 and a not in s1 => B \cap \overline{A}

a in s1 => A

那么

\begin{eqnarray*}
p(C) &=& p( B \cap \overline{A} )\\
&=& p(  \overline{A} \cap B )
\end{eqnarray*}
\begin{eqnarray*}
p(D) &=& p(\overline{ C } \cap A )\\
&=& p(\overline{ B \cap \overline{A} } \cap A )\\
&=& p( (\overline{B} \cup A) \cap A )\\
&=& p( \overline{B} A \cup A A )\\
&=& p( \overline{B} A \cup A )\\
&=& p(A)
\end{eqnarray*}

这样就很清晰了,当A发生时,返回a;当A不发生且B发生时,返回b。

于是前两个if可以优化为

if a in s1:
    return a
if b in s1:
    return b

按照这个方法,可以把代码优化成这样

def func(a, b):
    if a in s1:
        return a
    if b in s1:
        return b
    if a in s2:
        return a
    if b in s2:
        return b
    return a

逻辑和之前完全一致,但是代码清晰了很多。

从这个例子中,我品尝到数学的快乐,坚定了我继续学下去的信念。