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。

这是我通过程序一遍遍运行得出的结论,不保证完全理解正确!!

 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值