温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在cocos2d-x中实现真随机数

发布时间:2020-05-27 12:28:20 来源:网络 阅读:1916 作者:嗚拉呆 栏目:游戏开发

今天在项目中用到了随机数,但发现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;



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI