• cocos2dx关于获取随机数的问题


    之前在做一个游戏的时候需要获取随机数

    1 rand()%(end-start+1)+start;  

    参数end和start是为了设置获取随机数范围的,要想获取接近真实的随机数需要设置一个种子,比较常用的方法是以当前时间为种子,在cocos2d-x中提供了获取时间的方法,而且获取的时间更精确

    1 cc_timeval psv;
    2     CCTime::gettimeofdayCocos2d(&psv, NULL);
    3     unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;

    得到的时间能精确到毫秒级。

    项目的需求是要获取一组随机数,这就要用一个循环来获取大量的随机数了,一开始是这样做的:

     1 //CardDispatcher.cpp
     2 
     3 int CCardDispatcher::getRandomNumber(){
     4         cc_timeval psv;
     5     CCTime::gettimeofdayCocos2d(&psv, NULL);
     6     unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;
     7     srand(seed);
     8 
     9     int randNumber = random(0, 10);
    10     return randNumber;
    11 }
    12 
    13 int CCardDispatcher::random(int start, int end){
    14     
    15     return CCRANDOM_0_1()*end+start;
    16 
    17 }
    18 
    19 //MainGameLayer.cpp
    20 
    21 bool MainGameLayer::init(){
    22     CCLayer::init();
    23     this->schedule(schedule_selector(MainGameLayer::getCardNumber), 1.0);
    24     return true;
    25 }
    26 
    27 void MainGameLayer::getCardNumber(float dt){
    28     int randomNumber = CCardDispatcher::shareDispatcher()->getRandomNumber();
    29     CCLOG("%d", randomNumber);
    30 }

    调试的时候发现,得到的随机数很有规律......

    当时感觉很奇怪,在网上查了好长时间,也没找到什么问题(可能是没仔细看教程,哈哈)。后来突然感觉,是不是应该把设置种子放到循环外面,然后源码改动如下:

     1 //CardDispatcher.cpp
     2 
     3 int CCardDispatcher::getRandomNumber(){
     4     int randNumber = random(0, 10);
     5     return randNumber;
     6 }
     7 
     8 int CCardDispatcher::random(int start, int end){
     9     
    10     return CCRANDOM_0_1()*end+start;
    11 
    12 }
    13 
    14 
    15 //MainGameLayer.cpp
    16 
    17 bool MainGameLayer::init(){
    18     CCLayer::init();
    19 
    20     cc_timeval psv;
    21     CCTime::gettimeofdayCocos2d(&psv, NULL);
    22     unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;
    23     srand(seed);
    24     this->schedule(schedule_selector(MainGameLayer::getCardNumber), 1.0);
    25     return true;
    26 }
    27 
    28 void MainGameLayer::getCardNumber(float dt){
    29     int randomNumber = CCardDispatcher::shareDispatcher()->getRandomNumber();
    30     CCLOG("%d", randomNumber);
    31 }

    然后调试,成功。

    所以,设置种子的位置要放的循环外面.....

  • 相关阅读:
    一文读懂高性能网络编程中的I/O模型
    QQ的成功,远没有你想象的那么顺利和轻松
    解密“达达-京东到家”的订单即时派发技术原理和实践
    以网游服务端的网络接入层设计为例,理解实时通信的技术挑战
    老罗最新发布了“子弹短信”这款IM,主打熟人社交能否对标微信?
    最火移动端跨平台方案盘点:React Native、weex、Flutter
    ogre3D学习基础11 -- 交换两个场景管理器
    STL学习笔记2--list
    STL学习笔记1--vector
    设计模式 --- 学习总结
  • 原文地址:https://www.cnblogs.com/arthas/p/2842688.html
Copyright © 2020-2023  润新知