战斗中,玩家可以挑选六个技能,会随机触发一个技能,但也有可能是普通攻击。策划提出的思路是这样的,先在六个中间随机出一个,然后根据他们各自的几率计算是否触发。做了个简单的例子如下:
#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以后,刚好能和原定几率吻合!