• 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 }

    然后调试,成功。

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

  • 相关阅读:
    BZOJ 3132: 上帝造题的七分钟 树状数组+差分
    PAT Advanced 1006 Sign In and Sign Out (25 分)
    PAT Advanced 1011 World Cup Betting (20 分)
    PAT Basic 1032 挖掘机技术哪家强 (20 分)
    PAT Basic 1028 人口普查 (20 分)
    PAT Basic 1004 成绩排名 (20 分)
    大数据数据库HBase(二)——搭建与JavaAPI
    PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
    PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
    PAT Basic 1041 考试座位号 (15 分)
  • 原文地址:https://www.cnblogs.com/arthas/p/2842688.html
Copyright © 2020-2023  润新知