zoukankan      html  css  js  c++  java
  • 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 }

    然后调试,成功。

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

  • 相关阅读:
    【转】使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法
    配置Linux系统ssh免密登录
    numpy的随机数组
    numpy.where和numpy.piecewise的用法
    numpy、pandas学习笔记
    数据库行存储和列存储的区别
    pandas对DataFrame对象的基本操作
    pandas中assign方法的使用
    numpy实现快速傅里叶变换
    最小二乘法在线性拟合中的使用
  • 原文地址:https://www.cnblogs.com/arthas/p/2842688.html
Copyright © 2011-2022 走看看