配子一定比例致死的人类遗传病计算问题
半年没更博,文化课战士回来报道。
前言
老师同学们好!
本人高中生,有关生物的见识仅局限高中范围,本文有关专有用语可能不够准确。
%}
这道题的最初来源我没有能够找到,只在[1] 中有所发现。
问题分析
甲病有关基因用 X A X^A X A 与 X a X^a X a 表示,乙病有关基因用 B B B 与 b b b 表示。对于甲病的结果我不存在质疑,很容易得出该夫妇生出一个患甲病男孩的概率
P 1 = 1 2 × 1 2 × 1 4 = 1 16 P_1=\frac{1}{2}\times\frac{1}{2}\times\frac{1}{4}=\frac{1}{16}
P 1 = 2 1 × 2 1 × 4 1 = 1 6 1
接下来仅需计算该夫妇所生育的孩子中患乙病的概率 P 2 P_2 P 2 ,通过自由组合定律即可得出该题的答案
P = P 1 × P 2 P=P_1\times P_2
P = P 1 × P 2
问题的焦点在于如何计算 P 2 P_2 P 2 。
计算机模拟结果
将原问题抽离成为与现实相符的一个模型。假设现有一个大小为 N N N 的男性正常群体。
我将男性每一个个体从 1 1 1 至 N N N 编号记为 a i = i a_i=i a i = i 。为了满足题目条件,另 ∀ a i ≡ 1 ( m o d 6 ) \forall a_i\equiv 1 \pmod{6} ∀ a i ≡ 1 ( m o d 6 ) 的男性个体为乙病的携带者。
然后随机生成一个数 x ∈ [ 1 , N ] x\in [1,N] x ∈ [ 1 , N ] 表示个体6与编号为 x x x 的男性个体交配。
如果 x ≡ 1 ( m o d 6 ) x\equiv 1 \pmod{6} x ≡ 1 ( m o d 6 ) 则表示个体6与一男性乙病的携带者交配。考虑该男性的配子。若不考虑致死该男性配子 B B B 与 b b b 应为 1 : 1 1:1 1 : 1 。现 b b b 半数致死,则该男性配子比例应为 2 : 1 2:1 2 : 1 。因而再生成一个随机数 y ∈ [ 1 , 3 ] y\in[1,3] y ∈ [ 1 , 3 ] ,如果所得随机数为 1 1 1 则此次模拟该男性产生的配子为 b b b ,其余情况则为 B B B 。
如果 x x x 不满足 x ≡ 1 ( m o d 6 ) x\equiv 1 \pmod{6} x ≡ 1 ( m o d 6 ) 。则该男性产生的配子一定为 B B B 。
将男性产生的配子与女性的配子组合即可得到后代的基因型。
将随机生成 x x x 的步骤重复 Ω \Omega Ω 次,记录下其中后代为 b b bb b b 的次数 T T T 即可得到
P 2 = T Ω P_2=\frac{T}{\Omega}
P 2 = Ω T
计算机实现代码如下:
green,c++代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <cstdlib> using namespace std;#define REP(i,e,s) for(register int i=e; i<=s; i++) #define DREP(i,e,s) for(register int i=e; i>=s; i--) #define ll long long #define DE(...) fprintf(stderr,__VA_ARGS__) #define DEBUG(a) DE("DEBUG: %d\n" ,a) #define file(a) freopen(a".in" ,"r" ,stdin);freopen(a".out" ,"w" ,stdout) int read () { int x=0 ,f=1 ,ch=getchar (); while (ch>'9' ||ch<'0' ){if (ch=='-' )f=-1 ;ch=getchar ();} while (ch>='0' &&ch<='9' ){x=x*10 +ch-'0' ;ch=getchar ();} return x*f; } const int MAXN=1000000 +10 ;const int N=1000000 ;int a[MAXN];int _rand(int l,int r) { return rand ()%(r-l+1 )+l; } int main () { freopen ("data.out" ,"w" ,stdout); srand (time (0 )); printf ("%d\n" ,_rand(1 ,2 )); const int omega=1000000 ; int T=0 ; for (int i=1 ; i<=omega; i++) { int x=_rand(1 ,N); if (x%6 ==1 ) { int y=_rand(1 ,3 ); if (y==1 ) {T++; printf ("x:%d y:%d T+1\n" ,x,y); } else printf ("x:%d y:%d T+0\n" ,x,y); } else printf ("x:%d\n" ,x); } printf ("Ω:%d T:%d\n" ,omega,T); return 0 ; }
green,python代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import randomT=0 Omega=1000000 N=1000000 fp=open ("./data.txt" ,"w+" ) for i in range (1 ,Omega): x=random.randint(1 ,N) if (x%6 ==1 ): y=random.randint(1 ,3 ) if (y==1 ): T+=1 print ("x:" ,x," y:" ,y," T+1" ,file=fp) else : print ("x:" ,x," y:" ,y," T+0" ,file=fp) else : print ("x:" ,x,file=fp) print ("Ω:" ,Omega," T:" ,T,file=fp)fp.close()
计算机模拟的结果如下:
单机此处下载 /data.txt
最终 Ω = 1000000 \Omega=1000000 Ω = 1 0 0 0 0 0 0 T = 55506 T=55506 T = 5 5 5 0 6 。
P 2 = T Ω = 55506 1000000 = 0.055506 ≈ 1 18 P_2=\frac{T}{\Omega}=\frac{55506}{1000000}=0.055506\approx\frac{1}{18}
P 2 = Ω T = 1 0 0 0 0 0 0 5 5 5 0 6 = 0 . 0 5 5 5 0 6 ≈ 1 8 1
参考答案的计算方式
我在这里简单描述一下参考答案的计算方式。
对于一个人群,其中有 1 6 \frac{1}{6} 6 1 的正常男性,则可知男性中 B B : B b = 5 : 1 BB:Bb=5:1 B B : B b = 5 : 1 。假设不考虑考虑男性配子致死的情况,则该人群中正常男性产生的配子比例 B : b = 11 : 1 B:b=11:1 B : b = 1 1 : 1 。又由于有一半的 b b b 致死,则比例为 B : b = 11 : 0.5 = 22 : 1 B:b=11:0.5=22:1 B : b = 1 1 : 0 . 5 = 2 2 : 1 。则男性群体中产生 b b b 配子的概率为 P 2 = 1 23 P_2=\frac{1}{23} P 2 = 2 3 1 。这样得出的答案
P = P 1 × P 2 = 1 16 × 1 23 = 1 368 P=P_1\times P_2=\frac{1}{16}\times\frac{1}{23}=\frac{1}{368}
P = P 1 × P 2 = 1 6 1 × 2 3 1 = 3 6 8 1
应选C。
然而,这样计算得来的 P 2 P_2 P 2 与计算机模拟的结果不同。
我认为的计算方式
对于个体6,记她所遇到的男性个体为乙病携带者的事件为 S S S ,所遇到不为乙病携带者的事件为 T T T 。显然 P ( S ) = 1 6 P(S)=\frac{1}{6} P ( S ) = 6 1 , P ( T ) = 5 6 P(T)=\frac{5}{6} P ( T ) = 6 5 。
将正常男性群体产生的配子分为两类,一类为纯合子产生的配子 B 1 B_1 B 1 ,另一类为杂合子产生的配子 B 2 B_2 B 2 与 b 2 b_2 b 2 。
然后再考虑个体6所遇的配子的问题。记个体6的配子 b b b 与 b 2 b_2 b 2 相遇的事件为 Y Y Y 。
显然
P 2 = P ( S Y ) = P ( S ) × P ( Y ∣ S ) = 1 6 × 1 3 = 1 18 P_2=P(SY)=P(S)\times P(Y|S)=\frac{1}{6}\times\frac{1}{3}=\frac{1}{18}
P 2 = P ( S Y ) = P ( S ) × P ( Y ∣ S ) = 6 1 × 3 1 = 1 8 1
简单来说,就是个体6有 1 6 \frac{1}{6} 6 1 的可能与一名携带乙病基因的男性交配,而与一名携带乙病基因的男性交配后代为乙病的概率为 1 3 \frac{1}{3} 3 1 ,因而个体6与人群中正常男性交配后代患乙病的概率 P 2 = 1 3 × 1 6 P_2=\frac{1}{3}\times\frac{1}{6} P 2 = 3 1 × 6 1 。
两种计算方式答案不同的分析
参考答案错误的可能原因
对于参考答案的计算方式,我们可以理解为,将人群中所有正常男性的配子放在一起,再从这些配子中随机选取一个。这样可以解释为什么分母为 23 23 2 3 。
这样对于存在致死的男性的配子,他们的配子在整个男性人群中则会少去致死的那一部分,使存在致死男性的竞争力减弱。
简单来说,例如这里有 12 12 1 2 名男性,其中 10 10 1 0 人为 B B BB B B , 2 2 2 人为 B b Bb B b 。假设每个人产生两个配子。一共会产生 12 × 2 − 1 = 23 12\times2-1=23 1 2 × 2 − 1 = 2 3 个配子。则产生配子的比例为 B 1 : B 2 : b 2 = 20 : 2 : 1 B_1:B_2:b_2=20:2:1 B 1 : B 2 : b 2 = 2 0 : 2 : 1 。如果直接从这 23 23 2 3 个配子中计算比例,那么对于 B b Bb B b 男性人群与个体6交配的概率为 B 2 + b 2 B 1 + B 2 + b 2 = 1 + 3 23 < 1 6 \frac{B_2+b_2}{B_1+B_2+b_2}=\frac{1+3}{23}<\frac{1}{6} B 1 + B 2 + b 2 B 2 + b 2 = 2 3 1 + 3 < 6 1 。这与事实是矛盾。
事实情况应保证个体6与任意男性交配的概率相当,即个体6与 B b Bb B b 男性群体交配的比例应当为 1 6 \frac{1}{6} 6 1 。解决这一问题就需要分步进行讨论。
两种计算方式的适用性
如果对于人类群体而言,我认为,应当使用后面的计算方式。
如果对象是花粉传播的植物,若假设所有不携带乙病基因的雄性植株个体产生的花粉数相同,而携带乙病基因的雄性植株产生的花粉少 1 4 \frac{1}{4} 4 1 ,那么携带乙病基因的植株竞争力会减弱,则应当使用参考答案的方式。
我的态度
以下为我的态度,可能存在事实性错误
我认为参考答案的计算方法不符合实际,应为答案错误。 对于这样一个实际问题,不存在两种答案,更不存在一种更精确一种高级的说法,一定存在唯一正确的答案。 对于是否“超纲”的问题,我尚不清楚,但可以肯定的是往年高考出现过配子致死的题目。
恳请老师同学对我的想法批评指导。与我联系me@micdz.cn 。
参考资料
[1]. 2020学年第一学期浙南名校联盟第一次联考高三年级生物试题卷
鸣谢
感谢邓毅萍老师。
感谢许锜桐同学。