有这样一道概率论题目,我认为将其编写为C程序实现是一件非常有意思的事情,题目如下:
在一个人数很多的团体中普查某种疾病,为此要抽验N个人的血。有如下两种方法,法一为逐个抽验,则需验N次,法二为按k个人一组进行分组,把K个人抽来的血液混合在一起检验,如果呈阴性,则这k个人正常,只需要验一次。如果呈阳性,则这k个人逐个化验,则这k个人要验k+1次。现假设每个人化验呈阳性概率为p,且每个人化验结果相互独立,问p、k取不同值时对方法的选择如何。
在概率论中,这是一道依照期望来比较的题目,但当我们将它视为一道C语言题目,我们就需要在输入不同的k值后给定不同的抽验方案。
#include<stdio.h>
#include<math.h>
int main()
{
float p,k,N;//输入量
float Ex1,Ex2;//两种方法中每个人要验证次数的期望
printf("请依次输入总化验人数N,分成组数k,每个人化验呈阳性的概率p\n");
scanf("%f %f %f",&N, &k, &p);
float n=N/k;//每组人数
float q=1-p;//呈阴性的概率
Ex1=1;//第一种方法默认每个人都要检测,所以每个人检测次数的期望为1
float x=pow(q,n);
Ex2=1-pow(q,n)+1/n;
if(Ex2>Ex1){
printf("应该逐个验血\n");
printf("总验血次数为%f次\n",N*Ex1);
printf("这样验血比另一种方法效率提高了%f\n",(Ex2-Ex1));
} else{
printf("应该分批次验血\n");
printf("总验血次数为%f次\n",N*Ex2);
printf("这样验血比另一种方法效率提高了%f\n",(Ex1-Ex2));
}
return 0;
}
这样,在输入不同的检验情况时就会给出不同的采样方案,我认为是一件非常有趣的事情(毕竟像我这样概率论差点挂科的人是不会愿意去算的)
从这些结果也可以看出,在样本人数足够多、分组组数足够大、患病概率足够低任意情况下,都可以使用分批检验。