注册 登录
主题 : 【教程】cocos2d-x 3.2 随机数
级别: 新手上路
UID: 364300
精华: 0
发帖: 47
可可豆: 155 CB
威望: 155 点
在线时间: 34(时)
注册时间: 2014-08-21
最后登录: 2016-12-15
楼主 : 发表于: 2014-08-28 03:49    发自: Web Page
来源于 资料共享 分类

【教程】cocos2d-x 3.2 随机数   

今天做个练手项目需要用到随机数,先在网上一通查找,很少有解释清楚正确的。
找了几遍解释的比较清楚的C++关于随机数,知之为知之不知为不知。
要取得 (min,max] 的随机整数,使用(rand() % (max - min)) + min + 1;
例:(3,5]  不包含3,包含5
要取得 [min,max) 的随机整数,使用(rand() % (max - min)) + min;
例:[3,5) 包含3,不包含5
要取得 [min,max] 的随机整数,使用(rand() % (max - min + 1)) + min;
例:[3,5] 包含3,包含5
Util.cpp
#include "Util.h"

USING_NS_CC;

static bool isAction = false;

void Util::setSrand()
{
    struct timeval tv;
    // 获取本地时间
    gettimeofday(&tv, NULL);
    //根据时间产生随机种子
    unsigned long int tsrans = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    //设定随机数种子
    srand(tsrans);
}

int Util::random(const int min, const int max)
{
    if (!isAction)
    {
        setSrand();
        isAction = true;
    }
    return (rand() % (max - min)) + min;
}

int Util::random(const int max)
{
    if (!isAction)
    {
        setSrand();
        isAction = true;
    }
    return rand() % max;
}

调用方式
        int showCount = Util::random(3, 5);
        timeSpace = 0;
        log("ssssssssss=%d",showCount);

        int idx = Util::random(24);
        log("%d", idx);

Util.cpp里主要有三个函数,一个变量。
isAction是判断setSrand是否执行过,也就是程序运行之后这个函数只调用一次,
setSrand这个函数是用时间设置随机种子,并且只能设置一次,否则会出现连续的随机数字。注意是3.2版本的,跟2.0的差别很大。
不使用setSrand函数,随机出来的数字,顺序每次都是固定的,包含使用getRandomObject得到的也是固定顺序的。

不想多说了,有图有真相。
不使用setSrand函数的情况:

仔细看一下,两遍打印好像是一样哦,真的是一样耶!!

多次使用setSrand函数的情况:
  
看到没数字大部分都是连号的,跟好基友似的,这可能是由于每次都去更新时间种子,而时间种子相隔很近造成的。
也就是随机种子需要一个静态值,所以setSrand函数只执行一次。
或者能使用guid的hashcode也是挺好的,虽然guid的hashcode也有可能会重复,只是C++里guid的hashcode不懂我的心。

不知道上面的图片链接能否出来呀。

另外两个函数是返回随机数,一个是0~max,包含0不包含max,另外一个是min~max,包含min不包含max。
这是我通过程序一遍遍运行得出的结论,这么晚了,我也不能保证完全理解正确!!

[ 此帖被小塔在2014-08-28 16:55重新编辑 ]

级别: 新手上路
UID: 291099
精华: 0
发帖: 20
可可豆: 48 CB
威望: 38 点
在线时间: 55(时)
注册时间: 2014-02-08
最后登录: 2015-07-14
沙发 : 发表于: 2014-08-28 09:33    发自: Web Page
为啥不用CCRANDOM_0_1()
级别: 论坛版主

状态: 未签到 - [27天]
UID: 300874
精华: 13
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
注册时间: 2014-03-18
最后登录: 2016-05-06
板凳 : 发表于: 2014-08-28 09:47    发自: Web Page
这篇介绍随机数不错。

http://blog.csdn.net/star530/article/details/18713217
级别: 圣骑士
状态: 未签到 - [13天]
UID: 298324
精华: 6
发帖: 483
可可豆: 800 CB
威望: 798 点
在线时间: 282(时)
注册时间: 2014-03-08
最后登录: 2015-03-20
3 楼:  发表于: 2014-08-28 09:51    发自: Web Page
CCRANDOM_0_1()同样需要设置随机数种子,不如使用arc4random,这货才是真正的随机。
欢迎访问cocos2d-x博客www.zaojiahua.com皂荚花。
级别: 新手上路
UID: 291099
精华: 0
发帖: 20
可可豆: 48 CB
威望: 38 点
在线时间: 55(时)
注册时间: 2014-02-08
最后登录: 2015-07-14
4 楼:  发表于: 2014-08-28 10:10    发自: Web Page
哦 了解了
级别: 新手上路
UID: 364300
精华: 0
发帖: 47
可可豆: 155 CB
威望: 155 点
在线时间: 34(时)
注册时间: 2014-08-21
最后登录: 2016-12-15
5 楼:  发表于: 2014-08-28 22:44    发自: Web Page
回 1楼(eywprtiue) 的帖子
CCRANDOM_0_1() 实际用的也是rand()
级别: 新手上路
UID: 364300
精华: 0
发帖: 47
可可豆: 155 CB
威望: 155 点
在线时间: 34(时)
注册时间: 2014-08-21
最后登录: 2016-12-15
6 楼:  发表于: 2014-08-28 22:53    发自: Web Page
回 2楼(偶尔e网事) 的帖子
我用的3.2版本的,
cc_timeval psv;    
CCTime::gettimeofdayCocos2d(&psv, NULL);  
这些已经找不到,用的是
struct timeval tv;
gettimeofday(&tv, NULL);

我通过程序调试了几遍,理解的也差不多了。
只是getRandomObject这个也是不随机,就有点抓狂了。


arc4random是ios里面的吧?cocos2d-x要是也能提供这样完全随机的就好了,毕竟做游戏随机数的用途还是蛮大的。
[ 此帖被qhgccy在2014-08-28 23:00重新编辑 ]

级别: 新手上路
UID: 343478
精华: 0
发帖: 4
可可豆: 13 CB
威望: 13 点
在线时间: 28(时)
注册时间: 2014-07-15
最后登录: 2015-10-29
7 楼:  发表于: 2014-11-18 12:48    发自: Web Page
随机数具体有没有arc4random()这种函数?
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

验证问题:
苹果公司现任CEO是谁?2字 正确答案:库克

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部