触发几率的问题

战斗中,玩家可以挑选六个技能,会随机触发一个技能,但也有可能是普通攻击。策划提出的思路是这样的,先在六个中间随机出一个,然后根据他们各自的几率计算是否触发。做了个简单的例子如下:

#include "stdafx.h"

int rnd(int seed, int n = 6);

int _tmain(int argc, _TCHAR* argv[])
{
	float prob[6] = {0.28f, 0.2f, 0.17f, 0.08f, 0.22f, 0.27f};

	int prob_num[6] = {0};

	int MAX_NUM = 100000;

	float max_prob = 0.0f;
	for(int i = 0; i < 6; i++)
	{
		max_prob += prob[i];
	}

	for(int i = 0; i < MAX_NUM; i++)
	{
		int id = rnd(i);

		int p = (int)(prob[id] * 100);                             //@1

		int r = rnd(i * i, 101);

		if(r <= p)
			prob_num[id]++;

	}

	for(int i = 0; i < 6; i++)
	{
		printf("原定几率 %f, 实际触发次数 %d, 实际触发几率 %f.\n", prob[i], prob_num[i], 1.0 * prob_num[i] / MAX_NUM );
	}


	return 0;
}

int rnd(int seed, int n)
{
	int r = time(NULL) % 0xFF;
	srand(r + seed);
	r = rand() % n;
	return r;
}
输出结果:

原定几率 0.280000, 实际触发次数 4819, 实际触发几率 0.048190.
原定几率 0.200000, 实际触发次数 3456, 实际触发几率 0.034560.
原定几率 0.170000, 实际触发次数 2991, 实际触发几率 0.029910.
原定几率 0.080000, 实际触发次数 1271, 实际触发几率 0.012710.
原定几率 0.220000, 实际触发次数 3597, 实际触发几率 0.035970.
原定几率 0.270000, 实际触发次数 4726, 实际触发几率 0.047260.
实际触发几率在第一次随机被 1 / 6了!

当实际触发几率*6以后,刚好能和原定几率吻合! 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值