Leg*_*ter 3 python math probability combinatorics
我正在研究下面的编码问题,它看起来更像是概率问题而不是编码问题
由 5 个顶点组成的平台。顶点的坐标为:(-1,0)、(0.-1)。(0,0), (0.1)。(1.0)。从顶点 (xs,ys) 开始,并继续向左(即 x 坐标减少 1)、向右(即 x 坐标增加 1)、向上或向下随机移动。随后的移动方向是独立的。在从平台上掉下来之前到达顶点 (xe, ye) 的概率是多少?约束:(xs, ys) in [(-1.0), (0.-1), (0.0), (0.1), (1,0)] (xe, ye) in [(-1,0), ( 0.-1), (0,0), (0,1), (1.0)] xs != xend 或 ys != Yend
下面是我实现的方法,它适用于我分享的案例,但不适用于所有其他情况
def calculate_probability(xs, ys, xe, ye):
edges = [[-1, 0], [0, -1], [0, 1], [1, 0]]
if [xs, ys] in edges:
if xe == 0 and ye == 0:
return 0.25
elif xs == xe and ys == ye:
return 1.0
elif [xe, ye] in edges:
return 0.075
if xs == 0 and ys == 0:
if [xe, ye] in edges:
return 0.3
elif xe == 0 and ye == 0:
return 1
return 0
Run Code Online (Sandbox Code Playgroud)
如果我们处理从目的地开始的边缘情况,或者从边缘开始而目的地是中心的情况,那么我们会遇到一个简单的场景:找到通往中心的路,然后到达目的地。到达原点的0.25
概率是平坦的,然后只需到达正确的边缘即可。如果你随机走错了方向,你总能以0.25
成功的概率原路返回。在朝正确方向(到达目的地)行走之前,可以重复任意次数。
这意味着从原点开始,我们有 1/4 的机会选择正确的方向,有 3/4 的机会选择错误的方向。如果我们选择了正确的方向,我们就完成了,如果我们选择了错误的方向,我们就必须选择相反的方向才能回到原点并避免掉落,这是1/4的机会。将这些结合起来,我们第一次有 1/4 的机会是正确的,而第二次机会有 3/16 的机会。不断重复这个过程,我们最终得到如下公式:
1/4 + 1/4 * (3/16) + 1/4 * (3/16)^2 + 1/4 * (3/16)^3 + ...
= 1/4 * (1 + (3/16) + (3/16)^2 + (3/16)^3 + ...)
= 1/4 * (16/13)
= 4/13
Run Code Online (Sandbox Code Playgroud)
所以从原点开始,我们就有4/13
机会走到正确的边缘瓷砖而不掉落。
在代码中:
1/4 + 1/4 * (3/16) + 1/4 * (3/16)^2 + 1/4 * (3/16)^3 + ...
= 1/4 * (1 + (3/16) + (3/16)^2 + (3/16)^3 + ...)
= 1/4 * (16/13)
= 4/13
Run Code Online (Sandbox Code Playgroud)
更新:我有一种替代且可能更简单的方法来处理上面部分中的数学。
取P
代表从起点成功走到目的地而不摔倒的概率。忽略起点是目的地的边缘情况——上面已经处理过。我们知道有两种情况需要处理:
P
成功的机会(根据 的定义P
)。这3/16 * P
为这种情况提供了机会。这意味着我们有代数:
P = 1/4 + 3/16 * P
13/16 * P = 1/4
P = 4/13
Run Code Online (Sandbox Code Playgroud)
我们得到4/13
与之前相同的概率。