C++中操作随机数与概率
作者:张维,引用请注明出处
这里整理出两个实用小函数,用来处理随机数与概率问题。
1,int et_rand_between(int iBegin, int iEnd)
获取从iBegin到iEnd当中的一个随机数,含iBegin,iEnd.
比如,从0到100,任意取一个数。
2,bool et_rand_with_rate(int iTotal, int iRate)
假设共有iTotal张彩票,有iRate个人可能中奖,
那调用一次这个函数,就算一次你中或者不中,
整体来说,概率是iRate / iTotal,
比如,有10000张奖票,只有30张是有奖的,那就是调用et_rand_with_rate(1000, 30)
也许这个例子不是很恰当,那换一种说法吧,
假设你在玩游戏,进入一个关卡后,你有可能会遇到某个怪,它出现的概率是60%
现在你已经进入关卡了,我要马上选择让怪出现或者不出现,则调用一次et_rand_with_rate(100,60)
如果结果是true,怪物就出来。
接下来上代码和实例
代码在vc中通过测试
如果运行代码你会发现,在我设置为50%概率的时候,运行结果确实也差不多是50%命中,建议运行多次此代码以查看效果
注意点:
1,C中的随机数是伪随机,某种情况下是可预测的
2,在多线程的时候会有一些问题,如果你要做多线程处理,需要在代码上做一些修改,在性能越高的机器上越明显
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> int et_rand_between(int iBegin, int iEnd) { static bool bSeedInited = false; int iResult = 0; int iDiff = 0; int iTimeSeed = 0; int iSec = 0; int iSeed = 0; if (iBegin > iEnd){ return 0; } if (!bSeedInited) { iTimeSeed = time((time_t*)NULL); iSec = iTimeSeed % 10; iSeed = (iTimeSeed / 10) * iSec; srand(iSeed); rand(); bSeedInited = true; } iDiff = iEnd - iBegin + 1; iResult = rand() % iDiff + iBegin; return iResult; } bool et_rand_with_rate(int iTotal, int iRate){ int iRand = 0; bool bResult = false; iRand = et_rand_between(0, iTotal - 1); if (iRate > iRand){ bResult = true; } return bResult; } int _tmain(int argc, _TCHAR* argv[]) { int iRate = 50; int iTotal = 100; int iFrom = 1; int iTo = 100; int i = 0; bool bHit = false; int iHitCount = 0; for (i = iFrom - 1; i < iTo; i++){ bHit = et_rand_with_rate(iTotal, iRate); printf("%d,",bHit); if (bHit){ iHitCount++; } } printf("\n%d\n",iHitCount); system("pause"); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。