Cocos2d-x游戏开发之随机数使用

本站文章转载务必在明显处注明:原文链接 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;
}

二,循环产生一系列随机数,需设置随机数种子

参考文章:http://www.cnblogs.com/arthas/archive/2013/01/03/2842688.html
但是上面的随机数在循环产生一系列随机数时,每次运行产生的这一系列的随机数是一样的,这需要我们在循环外面设置随机数种子,如下设置

    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);
    }

三,在给定范围内(x,y),产生一组k数量不重复的随机数
请参考阅读这篇文章解说
http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html
在网上能找到几种实现方法,我这里只记录下认为比较高效的做法
用数组 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--;//在指定范围 向前移
    }
    



你可能感兴趣的:(cocos2d-x游戏开发)