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;
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。