一个NB的随机算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HQ354974212/article/details/86523095

在游戏中,大家会经常使用随机算法,但是如何选择一个好的伪随机?

这里提供一个思路:

这里提供了一个数组,有101个数据 ,分别代表%0 -  100%, base数组中每个元素值 都是该概率的基础值,比如对于10%的概率,base[10]它的基础值为1475 (其实这里都是乘以100000了,它本身应该是0.01475 ),  当第一次check时, 在0- 100000中随机一个值与1475*1  对比 , 当第二次check时, 实际上与 1475  *2  对比, 当第N次check时, 实际与  1475  *N 对比,  也就是说,次数越多,概率会升高,从而达到模拟10%的效果, 一旦触发成功, N值必须清零。

#define _CRT_RAND_S

#include <string>  
using namespace std;

#define PERCENT  100


//产生随机数,其中范围为min~max
unsigned int Range(int min, int max)
{
	errno_t err;
	unsigned int number;
	err = rand_s(&number);
	if (err != 0)
	{
		return 0;//产生失败,返回0
	}
	unsigned temp1 = (unsigned int)((double)number / ((double)UINT_MAX + 1) * double(max - min)) + min;
	return  temp1;
}
 


class  HQRandom
{
public:
	static 	unsigned int  base[PERCENT + 1];

	bool    Check(unsigned int  percent)
	{
		if (percent <= 0) return false;
		if (percent >= 100)
		{
			N = 0;
			return true;
		}

		unsigned int w = base[percent]; 
		unsigned int  current = w * (++N); //第N次触发的真实概率

		unsigned int  r = Range(0,100000);
		if (  r < current)
		{
			N = 0;
			return true;
		}

		return false;
	}

private:
	unsigned int   N = 0;
};

unsigned int  HQRandom::base[PERCENT + 1] =
{
	0,
	16,62,139,245,380,544,736,955,1202,1475,
	1774,2098,2448,2823,3222,3645,4092,4562,5055,5570,
	6108,6668,7249,7851,8474,9118,9783,10467,11171,11895,
	12638,13400,14181,14981,15798,16633,17491,18362,19249,20155,
	21092,22036,22990,23954,24931,25987,27045,28101,29155,30210,
	31268,32329,33412,34737,36040,37322,38584,39828,41054,42265,
	43460,44642,45810,46967,48113,49248,50746,52941,55072,57143,
	59155,61111,63014,64865,66667,68421,70130,71795,73418,75000,
	76543,78049,79518,80952,82353,83721,85057,86364,87640,88889,
	90110,91304,92473,93617,94737,95833,96907,97959,98990,100000
};


int main()
{
	//比如一个30%的概率

	HQRandom  rd;
	 

	for (size_t i = 1; i <= 100; i++)
	{
		if (rd.Check(3))
		{
			printf("\n第%d次调用,触发!!!", i);
			break;
		}
	}

}

最后给大家一张对比表, 

P 代表 1 %  100 %  

C代表  基础概率

N代表    P =  N  * C,  表示1%的概率运气最差需要尝试 6250次  可以触发一次。

 _____________________________________________________________ 
|                            Results                          |
|=============================================================|
|   P(E): 0.01   |  C: 0.00016  |  N: 6250 | ERR:  0.00012648 |
|   P(E): 0.02   |  C: 0.00062  |  N: 1613 | ERR: -0.00000141 |
|   P(E): 0.03   |  C: 0.00139  |  N: 720  | ERR:  0.00004174 |
|   P(E): 0.04   |  C: 0.00245  |  N: 409  | ERR:  0.00001194 |
|   P(E): 0.05   |  C: 0.0038   |  N: 264  | ERR: -0.00001107 |
|   P(E): 0.06   |  C: 0.00544  |  N: 184  | ERR: -0.00000059 |
|   P(E): 0.07   |  C: 0.00736  |  N: 136  | ERR:  0.00000628 |
|   P(E): 0.08   |  C: 0.00955  |  N: 105  | ERR: -0.00001036 |
|   P(E): 0.09   |  C: 0.01202  |  N: 84   | ERR:  0.00001398 |
|   P(E): 0.1    |  C: 0.01475  |  N: 68   | ERR:  0.00001454 |

|   P(E): 0.11   |  C: 0.01774  |  N: 57   | ERR:  0.00001193 |
|   P(E): 0.12   |  C: 0.02098  |  N: 48   | ERR: -0.00000956 |
|   P(E): 0.13   |  C: 0.02448  |  N: 41   | ERR: -0.00000663 |
|   P(E): 0.14   |  C: 0.02823  |  N: 36   | ERR:  0.00000091 |
|   P(E): 0.15   |  C: 0.03222  |  N: 32   | ERR: -0.00000223 |
|   P(E): 0.16   |  C: 0.03645  |  N: 28   | ERR: -0.00000523 |
|   P(E): 0.17   |  C: 0.04092  |  N: 25   | ERR:  0.00000019 |
|   P(E): 0.18   |  C: 0.04562  |  N: 22   | ERR: -0.00000028 |
|   P(E): 0.19   |  C: 0.05055  |  N: 20   | ERR:  0.00000131 |
|   P(E): 0.2    |  C: 0.0557   |  N: 18   | ERR: -0.00000765 |

|   P(E): 0.21   |  C: 0.06108  |  N: 17   | ERR: -0.00000150 |
|   P(E): 0.22   |  C: 0.06668  |  N: 15   | ERR:  0.00000627 |
|   P(E): 0.23   |  C: 0.07249  |  N: 14   | ERR:  0.00000414 |
|   P(E): 0.24   |  C: 0.07851  |  N: 13   | ERR: -0.00000178 |
|   P(E): 0.25   |  C: 0.08474  |  N: 12   | ERR: -0.00000643 |
|   P(E): 0.26   |  C: 0.09118  |  N: 11   | ERR: -0.00000524 |
|   P(E): 0.27   |  C: 0.09783  |  N: 11   | ERR:  0.00000539 |
|   P(E): 0.28   |  C: 0.10467  |  N: 10   | ERR: -0.00000035 |
|   P(E): 0.29   |  C: 0.11171  |  N: 9    | ERR: -0.00000244 |
|   P(E): 0.3    |  C: 0.11895  |  N: 9    | ERR:  0.00000110 |

|   P(E): 0.31   |  C: 0.12638  |  N: 8    | ERR:  0.00000086 |
|   P(E): 0.32   |  C: 0.134    |  N: 8    | ERR: -0.00000107 |
|   P(E): 0.33   |  C: 0.14181  |  N: 8    | ERR:  0.00000605 |
|   P(E): 0.34   |  C: 0.14981  |  N: 7    | ERR: -0.00000011 |
|   P(E): 0.35   |  C: 0.15798  |  N: 7    | ERR: -0.00000378 |
|   P(E): 0.36   |  C: 0.16633  |  N: 7    | ERR:  0.00000137 |
|   P(E): 0.37   |  C: 0.17491  |  N: 6    | ERR:  0.00000086 |
|   P(E): 0.38   |  C: 0.18362  |  N: 6    | ERR: -0.00000527 |
|   P(E): 0.39   |  C: 0.19249  |  N: 6    | ERR:  0.00000450 |
|   P(E): 0.4    |  C: 0.20155  |  N: 5    | ERR:  0.00000277 |

|   P(E): 0.41   |  C: 0.21092  |  N: 5    | ERR: -0.00000005 |
|   P(E): 0.42   |  C: 0.22036  |  N: 5    | ERR: -0.00000485 |
|   P(E): 0.43   |  C: 0.2299   |  N: 5    | ERR:  0.00000140 |
|   P(E): 0.44   |  C: 0.23954  |  N: 5    | ERR: -0.00000014 |
|   P(E): 0.45   |  C: 0.24931  |  N: 5    | ERR:  0.00000310 |
|   P(E): 0.46   |  C: 0.25987  |  N: 4    | ERR: -0.00000220 |
|   P(E): 0.47   |  C: 0.27045  |  N: 4    | ERR: -0.00000280 |
|   P(E): 0.48   |  C: 0.28101  |  N: 4    | ERR:  0.00000224 |
|   P(E): 0.49   |  C: 0.29155  |  N: 4    | ERR: -0.00000217 |
|   P(E): 0.5    |  C: 0.3021   |  N: 4    | ERR: -0.00000280 |

|   P(E): 0.51   |  C: 0.31268  |  N: 4    | ERR:  0.00000322 |
|   P(E): 0.52   |  C: 0.32329  |  N: 4    | ERR: -0.00000053 |
|   P(E): 0.53   |  C: 0.33412  |  N: 3    | ERR:  0.00000012 |
|   P(E): 0.54   |  C: 0.34737  |  N: 3    | ERR:  0          |
|   P(E): 0.55   |  C: 0.3604   |  N: 3    | ERR:  0.00000161 |
|   P(E): 0.56   |  C: 0.37322  |  N: 3    | ERR:  0.00000244 |
|   P(E): 0.57   |  C: 0.38584  |  N: 3    | ERR:  0.00000030 |
|   P(E): 0.58   |  C: 0.39828  |  N: 3    | ERR:  0.00000143 |
|   P(E): 0.59   |  C: 0.41054  |  N: 3    | ERR: -0.00000375 |
|   P(E): 0.6    |  C: 0.42265  |  N: 3    | ERR:  0.00000024 |

|   P(E): 0.61   |  C: 0.4346   |  N: 3    | ERR: -0.00000375 |
|   P(E): 0.62   |  C: 0.44642  |  N: 3    | ERR:  0.00000060 |
|   P(E): 0.63   |  C: 0.4581   |  N: 3    | ERR: -0.00000381 |
|   P(E): 0.64   |  C: 0.46967  |  N: 3    | ERR:  0.00000006 |
|   P(E): 0.65   |  C: 0.48113  |  N: 3    | ERR:  0.00000399 |
|   P(E): 0.66   |  C: 0.49248  |  N: 3    | ERR: -0.00000065 |
|   P(E): 0.67   |  C: 0.50746  |  N: 2    | ERR: -0.00000119 |
|   P(E): 0.68   |  C: 0.52941  |  N: 2    | ERR: -0.00000077 |
|   P(E): 0.69   |  C: 0.55072  |  N: 2    | ERR: -0.00000220 |
|   P(E): 0.7    |  C: 0.57143  |  N: 2    | ERR:  0.00000072 |

|   P(E): 0.71   |  C: 0.59155  |  N: 2    | ERR:  0.00000036 |
|   P(E): 0.72   |  C: 0.61111  |  N: 2    | ERR: -0.00000059 |
|   P(E): 0.73   |  C: 0.63014  |  N: 2    | ERR:  0.00000161 |
|   P(E): 0.74   |  C: 0.64865  |  N: 2    | ERR:  0.00000072 |
|   P(E): 0.75   |  C: 0.66667  |  N: 2    | ERR:  0.00000191 |
|   P(E): 0.76   |  C: 0.68421  |  N: 2    | ERR: -0.00000029 |
|   P(E): 0.77   |  C: 0.7013   |  N: 2    | ERR:  0.00000077 |
|   P(E): 0.78   |  C: 0.71795  |  N: 2    | ERR:  0.00000077 |
|   P(E): 0.79   |  C: 0.73418  |  N: 2    | ERR:  0.00000173 |
|   P(E): 0.8    |  C: 0.75     |  N: 2    | ERR:  0          |

|   P(E): 0.81   |  C: 0.76543  |  N: 2    | ERR: -0.00000143 |
|   P(E): 0.82   |  C: 0.78049  |  N: 2    | ERR:  0.00000143 |
|   P(E): 0.83   |  C: 0.79518  |  N: 2    | ERR: -0.00000047 |
|   P(E): 0.84   |  C: 0.80952  |  N: 2    | ERR: -0.00000262 |
|   P(E): 0.85   |  C: 0.82353  |  N: 2    | ERR:  0.00000042 |
|   P(E): 0.86   |  C: 0.83721  |  N: 2    | ERR:  0.00000048 |
|   P(E): 0.87   |  C: 0.85057  |  N: 2    | ERR: -0.00000351 |
|   P(E): 0.88   |  C: 0.86364  |  N: 2    | ERR:  0.00000280 |
|   P(E): 0.89   |  C: 0.8764   |  N: 2    | ERR: -0.00000351 |
|   P(E): 0.9    |  C: 0.88889  |  N: 2    | ERR:  0.00000095 |

|   P(E): 0.91   |  C: 0.9011   |  N: 2    | ERR:  0.00000089 |
|   P(E): 0.92   |  C: 0.91304  |  N: 2    | ERR: -0.00000298 |
|   P(E): 0.93   |  C: 0.92473  |  N: 2    | ERR: -0.00000107 |
|   P(E): 0.94   |  C: 0.93617  |  N: 2    | ERR: -0.00000017 |
|   P(E): 0.95   |  C: 0.94737  |  N: 2    | ERR:  0.00000143 |
|   P(E): 0.96   |  C: 0.95833  |  N: 2    | ERR: -0.00000303 |
|   P(E): 0.97   |  C: 0.96907  |  N: 2    | ERR: -0.00000208 |
|   P(E): 0.98   |  C: 0.97959  |  N: 2    | ERR: -0.00000178 |
|   P(E): 0.99   |  C: 0.9899   |  N: 2    | ERR:  0.00000095 |
|   P(E): 1      |  C: 1        |  N: 1    | ERR:  0          |
|________________|______________|__________|__________________|

猜你喜欢

转载自blog.csdn.net/HQ354974212/article/details/86523095
今日推荐