1. 程式人生 > >cocos2dx-3.0隨機數獲取方法

cocos2dx-3.0隨機數獲取方法

關於cocos2d-x隨機數獲取方法問題一直很糾結,自帶的CCRANDOM_0_1由於未加入隨機種子,得到的不是真正的隨機數,之前一直使用,直到被公司測試發現通過CCRANDOM_0_1獲得的隨機數在每次重新啟動遊戲之後得到的數都一樣。,檢視CCRANDOM_0_1的原始碼的實現是這樣的:
#define CCRANDOM_0_1() ((float)rand()/RAND_MAX)

通過定義巨集的方式 ,使用C語言的rand()函式去獲得隨機數。但是,並沒有新增隨機種子,所以造成了不能獲得。下面我們舉一個栗子來證明一下:

//迴圈10次
    for (int i = 0; i < 10; i++) {
        //只使用rand()函式,不新增隨機種子
        int a = rand()%10;
        //列印
        printf("a = %d \n",a);
    }

得到如下結果:


ps:高清屏的macbook傷不起啊,圖片太大。

連續執行兩次,獲得的隨機數是一樣的

下面我們加入隨機種子:

srand ((unsigned)time(nullptr));

程式如下:
//加入隨機種子,傳入時間,保證每次的數值不一樣
    srand ((unsigned)time(nullptr));
    //迴圈10次
    for (int i = 0; i < 10; i++) {
        
        //只使用rand()函式,不新增隨機種子
        int a = rand()%10;
        //列印
        printf("a = %d \n",a);
    }

執行程式得到如下結果:


執行多次得到的隨機數不同。

下面我們來講解一下隨機種子函式 srand()函式:

void	 srand(unsigned);

srand()函式是一個無返回值,需要一個unsigned引數的函式,如果每次傳入的引數值相同獲得的隨機種子也是一樣的,如果有興趣的同學,可以測試一下,樓主已經測試,結果是相同的,這兒就不在貼程式碼和執行結果了。這也是為什麼使用time(nullptr)作為引數的原因,因為時間是不可能相同的(這個相信大家都知道,哈哈,我就不廢話了),所以也就能得到真正的隨機數了。

好了,這篇就講到這裡。