cocos2dx里真正的随机函数

来源:互联网 发布:ios软件闪退 编辑:程序博客网 时间:2024/06/05 08:46

最近在做一个回合制游戏,要实现暴击闪避的判断,这就要一个随机数进行判断比较了。

之前一直在用srand((int)time(0)); rand();的组合,但是这个是以秒为单位的,同秒之内。。基本没区别,毕竟我回合制里边,法师一个aoe,肯定要一个循环瞬间判断给予每个敌人(多对象同时调用rand())的伤害,就是机器再烂。。也不会超过1秒这么大的延迟吧。。就一直要么全闪避,要么全暴击,虽然不是次次这样,但是超过80%是这种雷同情况,让人蛋疼而忧伤。 - -||


所以查资料发现了GetTickCount();这个函数 ,是微妙级的,可用于随机种子srand(GetTickCount());但依然各种雷同,N胞胎,蛋疼而忧伤。。 - -||

很多人都说c/c++里没有真正的随机,除非量子计算机,也就是硬件支持才行。看来只能靠手法解决了。所以试了试,种子里边再加个随机rand(),哇塞~居然成功了~^_^


终极形式,就是用这个作为种子:srand(GetTickCount()+ rand());

经验证,ok的,瞬间多少次,不同对象同时rand(),都结果不同,哇哈哈,当然种子后边这个rand()的要根据需求2次处理,大家随意,重点是这个随机种子的处理。


可惜的是GetTickCount()属于win,打包apk的时候会报错,经测试,简单点的方法是种子函数改为: srand(int(time(0))+ rand());

复杂点的就是利用linux里的clock_gettime函数重新实现一下,代码如下

// 返回自系统开机以来的毫秒数(tick)unsigned long GetTickCount(){    struct timespec ts;    clock_gettime(CLOCK_MONOTONIC, &ts);    return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);}int main(){    struct timespec time1 = { 0, 0 };    clock_gettime(CLOCK_REALTIME, &time1);    printf("CLOCK_REALTIME: %d, %d\n", time1.tv_sec, time1.tv_nsec);    clock_gettime(CLOCK_MONOTONIC, &time1);    printf("CLOCK_MONOTONIC: %d, %d\n", time1.tv_sec, time1.tv_nsec);    clock_gettime(CLOCK_MONOTONIC_RAW, &time1);    printf("CLOCK_MONOTONIC_RAW: %d, %d\n", time1.tv_sec, time1.tv_nsec);    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);    printf("CLOCK_PROCESS_CPUTIME_ID: %d, %d\n", time1.tv_sec,           time1.tv_nsec);    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time1);    printf("CLOCK_THREAD_CPUTIME_ID: %d, %d\n", time1.tv_sec,           time1.tv_nsec);    printf("\n%d\n", time(NULL));    printf("tick count in ms: %ul\n", GetTickCount());    return 0;}


1 0
原创粉丝点击