【教程】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
要取得 的随机整数,使用(rand() % (max - min + 1)) + min;
例: 包含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。
这是我通过程序一遍遍运行得出的结论,这么晚了,我也不能保证完全理解正确!!

为啥不用CCRANDOM_0_1()

这篇介绍随机数不错。

http://blog.csdn.net/star530/article/details/18713217

CCRANDOM_0_1()同样需要设置随机数种子,不如使用arc4random,这货才是真正的随机。

哦 了解了:870:

CCRANDOM_0_1() 实际用的也是rand()

我用的3.2版本的,
cc_timeval psv;
CCTime::gettimeofdayCocos2d(&psv, NULL);
这些已经找不到,用的是
struct timeval tv;
gettimeofday(&tv, NULL);

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

arc4random是ios里面的吧?cocos2d-x要是也能提供这样完全随机的就好了,毕竟做游戏随机数的用途还是蛮大的。

随机数具体有没有arc4random()这种函数?