记录:游戏开发中那些小坑坑。记录游戏开发过程中,那些有点意思的思路和代码。
首先:c++ 随机值rand()。
无论你怎么去百度,都说rand()是伪随机,加上时间种子srand(time(NULL));就变成了真随机。那么真的天正的去 int m_rand=rand()%10+10;取(10~20)之间的随机数的时候。其实已经不是“真随机了”。当值太小的时候看不出什么,但是当我上一款游戏捕鱼,概率在万分之几的时候,差距就立马体现出来。
分析:比如鱼捕获概率是万分之200,鱼倍数时50倍。理论上在这条鱼身上是不会亏也不会赚的,但是实际上对于大多数这种鱼而言我们都是亏的。为什么呢?rand()最大32767(int 4字节)一个rand()不够,那么
拼接的方式
int m_r_high=rand()%100;
int m_r_low=rand()%100;
int m_real_rand=m_r_high*100+m_r_low;
这样m_real_rand就是我们要的随机,但是它不是真的随机,捕获的概率大于设置概率。因为在0-32767上是均匀得。那么小于100的话每个数32699上每个数也是均匀得,当在32700-32767时取余数,意味着68以上 的数永远不存在,即68以下概率大于我们想的小于68的概率。
算法改进:
既然rand()只能对应32768个数,那么只要建立函数,换算成0-10000的概率不就好了
int m_r_temp = rand();
int m_r_real = m_r_temp * 10000 / 32768;
上线一跑果然好了很多,某天该死的产品(看不到看不到),把概率改成了10万,同理松松的解决的,我天,概率又偏了。什么鬼,内心是奔溃的。 可以看成
int m_r_temp = rand();
int m_r_real = m_r_temp * 3.05;
那么这个m_r_raal是不连续的,即0,3,6,9 这就意味着 设置概率为8时,实际判断 概率为6。在10万分之2的概率上玩家体会不到,但是服务器一统计就很敏感。
回到1万为什么概率没偏呢,好吧其实是偏了,不过影响小太多了,服务器数据没反应出来。读者自己算去。
改进又一次
int CTableFrameSink::tools_hrand()
{
int t_rand = rand();
if (t_rand >= 30000)
{
return tools_hrand();
}
else
return t_rand;
}
既然偏了是因为零头影响那么,递归把零头抹去呗。
*其次:变量回执问题*
有时候会有这样的情况
if (boolFlag) {
boolFlag = false;
}
else {
boolFlag = true;
}
常用吧,我也是这么觉得的。但是括号这么累哎,于是有
boolFlag=!boolFlag;
//或者
boolFlag=1-boolFlag;
那么跳跃下思路可否有两个值,也是能这么优雅的切换呢?
so:数学渣开始分析了
假设:f(x)=ax+b;
有:f(n)=an+b;f(n)=m;
f(m)=n=am+b;
消除b => a=-1
b=m+n;
f(x)=n+m-x;
紧接着:UI美术做好了。我要去工作了,有空继续