本站文章转载务必在明显处注明:原文链接 http://blog.csdn.net/cjsen/article/details/10147169
前言
随机数作为游戏中最为常用,下面记录在cocos2d-x 2.0上使用随机数的情况
一,简单用法 在指定范围内产生一个随机数
int SFPlayTestScene::random(int start, int end){
float i = CCRANDOM_0_1()*(end-start+1)+start;
return (int)i;
}
二,循环产生一系列随机数,需设置随机数种子
但是上面的随机数在循环产生一系列随机数时,每次运行产生的这一系列的随机数是一样的,这需要我们在循环外面设置随机数种子,如下设置
cc_timeval psv;
CCTime::gettimeofdayCocos2d(&psv, NULL);
unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;
srand(seed);
示例
cc_timeval psv;
CCTime::gettimeofdayCocos2d(&psv, NULL);
unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;
srand(seed);
for (int i = 0; i < quantity; i++) {
int num = this->random(0, end - 1);
}
请参考阅读这篇文章解说
在网上能找到几种实现方法,我这里只记录下认为比较高效的做法
用数组 A[] 存放x到y的数值,然后在(x,y)产生第一个随机数H做为下标,从数组A中取出A[H],然后将数组最后个元素赋值给A[H],再重新在(x,y-1)产生,如些循环
具体代码实现
int quantity = 12;
int start = 0;
int end = 36;
int total = abs(end - start);
if (quantity >total) {
CCLog("随机数错误");
}
int sequence[total]; //存放随机数的数组
int output[quantity]; //最终生成的不重复一系列随机数
//将sequence 初始化
for (int i = 0; i < total; i++) {
sequence[i] = start+i;
}
//随机数种子
cc_timeval psv;
CCTime::gettimeofdayCocos2d(&psv, NULL);
unsigned long int seed = psv.tv_sec*1000 + psv.tv_usec/1000;
srand(seed);
for (int i = 0; i < quantity; i++) {
int num = this->random(0, end - 1);//在指定范围下产生随机数
output[i] = sequence[num];//将产生的随机数存储
sequence[num] = sequence[end-1];//将最后个下标的值填充到随机产生的下标中
end--;//在指定范围 向前移
}