版权声明:本文为博主原创文章,未经博主允许不得转载。 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 |
|________________|______________|__________|__________________|