今天在项目中用到了随机数,但发现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;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。