在cocos2d-x中实现真随机数
更新:HHH   时间:2023-1-7


今天在项目中用到了随机数,但发现cocos2d-x中宏CCRANDOM_0_1提供的都是非常有规律的随机数,后来上网查资料的值,产生随机数的函数rand需要一个“种子”,默认情况下,该种子的值是不变的,因此每次程序运行,我们都会看到,它所产生的一组随机数都是和上次的一样的,那么为了能够产生真随机数,我们就必须来动态的修改该种子的值,该过程可通过srand(unsigned int speed)函数实现,具体实现过程如下:

这里直接把它写成一个函数方便调用

static float myRand_0_1()

{

   cc_timeval psv;  

   CCTime::gettimeofdayCocos2d( &psv, NULL );    // 获取本地时间

   //根据时间产生随机种子

   //(这里加上一个rand函数,可解决在循环内(时间间隔极短)取随机数时,

   //连续取得的几个值相同的问题)

   unsigned int tsrans = psv.tv_sec * 1000 + psv.tv_usec / 1000 + rand();

   srand(tsrans);    //设定随机数种子

   return CCRANDOM_0_1();

}


这里补充一点:

c语言里函数rand()和srand()的用法:

rand(void)用于产生一个伪随机unsigned int 整数。
srand(seed)用于给rand()函数设定种子。


srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。比如:
srand((UINT)GetCurrentTime());
int x = rand() % 100;
是生成 0 到 100 之间的随机数。


srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真

的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下:
rand = rand*const_1 + c_var;



返回游戏开发教程...