一、提出问题
有一种抽奖活动,需要玩家抽中6次指定卡牌即可获奖,假设每次抽取都是独立的,抽中指定卡牌概率均为50%,卡池无限大。如果一名玩家总共抽取10次卡牌,问:能够获奖的概率?
二、建立模型
首先建立一个可以表示抽奖结果的模型。因为每次抽取只有两种结果,且概率为50%,故可以用1和0来分别表示中和未中指定卡牌;玩家抽奖结果则可以表示为一串二进制数,如:1011001001,代表其中5次抽中指定卡牌,5次未抽中。
然后设计一个可以统计二进制数中1的个数的方法。考虑到十进制数为偶数时,对应的二进制数尾数为0;十进制数为奇数时,对应的二进制数尾数为1;通过二进制数所对应十进制数的奇偶性,可以判断二进制数的尾数是否为1。以此为基础,只要判断完一次二进制数的尾数,如果是偶数则除以2,如果是奇数则减1再除以2,就可以去掉已判断的尾数,并进行下一次新的对尾数的判断,以此类推,直到这个数变为0。
方法程序代码如下:
int count(int x){
int num=0;
while(x!=0){
if(x%2==1){
x=(x-1)/2;
num++;
}else
x=x/2;
}
return num;
}
例如统计前例1011001001中1的个数,程序运行如下:
int main(void){
printf(