cocos2dx里真正的随机函数

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

之前一直在用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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值