【ROSALIND】【练Python,学生信】59 染色体的独立分离

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】00 写在前面 谢谢配合~

题目:
染色体的独立分离(Independent Segregation of Chromosomes)
Given: A positive integer n≤50.
所给:一个不大于50的正整数n。
Return: An array A of length 2n in which A[k] represents the common logarithm of the probability that two diploid siblings share at least k of their 2n chromosomes (we do not consider recombination for now).
需得:一个长度为2n的数组A,A[k]是两个二倍体同胞兄弟共享2n条染色体中至少k条染色体的概率,用常用对数表示。(不考虑染色体重组)
测试数据
5
测试输出
0.000 -0.004 -0.024 -0.082 -0.206 -0.424 -0.765 -1.262 -1.969 -3.010
生物学背景
二倍体生物的生殖细胞是单倍体,一个配子只含有两条同源染色体中的一条;雌雄配子结合时,合子的基因组再次恢复为二倍体。
孟德尔第一定律和第二定律分别解释了同源染色体的分离和非同源染色体的自由组合。
数学背景
要理解二项分布,我们可以从抛硬币开始。考虑下面的场景:如果我们把一枚硬币抛92次,得到51次、27次、92次正面向上的概率各是多少呢?我们可以用一个随机变量表示每次抛硬币的结果,其中“正面向上”和“反面向上”的概率各是0.5。假设每个随机变量相互独立(即两次抛硬币的结果不会互相影响),这样连续抛下去,每次“成功”的概率分布就遵从二项分布。
一般地,如果随机变量X服从参数为n和p的二项分布,我们记为X∈B(n,p)。n次试验中正好得到k次成功的概率由概率质量函数给出:

二项式系数的计算方法为:

思路
本题中同胞兄弟染色体相同的概率本质上与抛硬币是相同的,可以将本题分为两部分,根据公式求解,并不复杂。
第一部分:根据二项分布的特点得到正好有k条染色体相同的概率。这里用概率质量函数就可求出。
第二部分:求解累积分布函数(CDF)。可以看到,题目中要求的是至少k条染色体相同的概率,说明所求的是累积值,因此将概率分别相加即可。
多说两句:用我的代码得到的结果与题目中给的答案并不完全一致,似乎有小数保留精度的问题,这一块于我一直是笔糊涂账。既然答案通过,我也就没有深究,感兴趣的可以研究一下Python的数位精度机制。
代码