題目連結:https://rosalind.info/problems/lia/
今天的又是非常「奇怪」的一題,題目輸入與輸出之間的關係不明朗
輸入:
2 1
輸出:
0.684
一頭霧水,啥軌?!
首先要知道0.684
這個數字是怎麼來的
就是175除以256!
0.684 ≈ 175/256 = 0.6836
題目翻譯成白話文:
孟德爾分配律,要計算龐尼特方格
一開始是固定的AaBb
的基因型,
隨機產生後代,每一個子代都會產生兩個子代
每一代的每一個孩子,各自去外面找了一個固定模板AaBb
基因型的配偶
而不是彼此互相交配
給予k和N
計算k代之後,基因型仍然是AaBb
的個體數量 >=N 個的機率有多大?
再更白話:Tom是AaBb
,找了AaBb
的女人做老婆
Tom家族不知為何得到一種家庭詛咒,每個後代只能找AaBb
的人當老婆/老公
而且每個子代都會誕生兩個孩子
這題題目不難,只要能看懂題目敘述
知道小技巧後,就能輕而易舉解出
這題可以想像成呢:
有個四面骰子,只有一面寫著「AaBb」,其他三面不是
接著我們將骰子丟四次,試問「至少出現一次AaBb」的機率是多少?
=> 至少成功一次 = 100% − 全部失敗的機率
那麼回頭看,題目範例就是:
100% - (3/4)^4 = 1−(81/256) = 175/256 ≈ 0.684
import math
def lia(k: int, N: int) -> float:
n = 2 ** k
p = 0.25
cdf = 0.0
for i in range(N):
cdf += math.comb(n, i) * (p ** i) * ((1 - p) ** (n - i))
return 1.0 - cdf
print(f"{lia(2, 1):.3f}")