今天做个练手项目需要用到随机数,先在网上一通查找,很少有解释清楚正确的。
找了几遍解释的比较清楚的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。
这是我通过程序一遍遍运行得出的结论,这么晚了,我也不能保证完全理解正确!!