C++中的不定层迭代,以若干面骰子概率问题为例

 

很多人对不定层迭代,用得都很晕乎。

其实很简单,以下就以m个n面的骰子掷到的点数的和为例,看看n面骰子的存在的概率组合方式。

 

#include <iostream>

// By Minsky

 

void SumIter(int sumCeil, int nNum, int mNum, int curNum, int *pNumArr)

{

curNum--;// 当前所处的层次

int sumTmp = sumCeil;// 该处做拷贝用于计算

 

for (int i=1; i<=nNum; i++)

{

sumCeil = sumTmp+ i;// 迭代的实际计算过程,修改此处,就可以得到各种的实际应用的迭代了

 

if (curNum == 0)// 最底层

{

pNumArr[sumCeil]++;// 最底层数据的存储

}

else

{

SumIter(sumCeil, nNum, mNum, curNum, pNumArr);

}

}

}

 

void SumSave(int nNum, int mNum, int *pNumArr)

{

int sumCeil = 0;

SumIter(sumCeil,nNum,mNum,mNum,pNumArr);

}

 

int main()

{

int nNum = 6;// 每个骰子的面数,每 层的循坏次数

int mNum = 2;// 骰子的个数,迭代的层次

 

int *pNum = (int*) malloc((nNum*mNum +1)*sizeof(int));

::memset(pNum,0x0,(nNum*mNum+1)*sizeof(int));

 

SumSave(nNum,mNum,pNum);

 

for(int i=0; i<nNum*mNum+1; i++)

{

std::cout<<i<<","<< pNum[i]<<std::endl;// 输出

}

 

free(pNum);

return 0;

}

 

代码如上。

比如nNum = 4,而mNum =3,则该代码等价于:

for()

{

for()

{

for()

{

}

}

}

 

 

该问题的衍生阐述可以理解为:

如果nNum = 2,mNum = 1,那么该问题则简化为抛硬币的问题,即是,一个硬币正反两面出现的排列组合。

如果nNum = 6,mNum = 2,就是我们平时麻将牌的骰子的排序数字啦。

如果nNum =13,mNum = 4,就是我们的4色球彩票的统计预期啦。

 

当然该模型如果稍微加以改进便可做成每层迭代都做特殊处理的方式。

 

当然这个如果只是作为计算概率的方式确实有点儿傻啦,指不定被概率出身的同行们耻笑呢。

看到网上没有相关的文章(也许是我不擅长词条挖掘吧),就发出来供刚刚接触这个的同学们一起探讨学习吧,更多可以联系我,http://blog.csdn.net/minkowsky。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值