cocos2dx-3.0隨機數獲取方法
阿新 • • 發佈:2019-02-16
關於cocos2d-x隨機數獲取方法問題一直很糾結,自帶的CCRANDOM_0_1由於未加入隨機種子,得到的不是真正的隨機數,之前一直使用,直到被公司測試發現通過CCRANDOM_0_1獲得的隨機數在每次重新啟動遊戲之後得到的數都一樣。,檢視CCRANDOM_0_1的原始碼的實現是這樣的:
得到如下結果:
程式如下:
執行程式得到如下結果:
srand()函式是一個無返回值,需要一個unsigned引數的函式,如果每次傳入的引數值相同獲得的隨機種子也是一樣的,如果有興趣的同學,可以測試一下,樓主已經測試,結果是相同的,這兒就不在貼程式碼和執行結果了。這也是為什麼使用time(nullptr)作為引數的原因,因為時間是不可能相同的(這個相信大家都知道,哈哈,我就不廢話了),所以也就能得到真正的隨機數了。
#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)作為引數的原因,因為時間是不可能相同的(這個相信大家都知道,哈哈,我就不廢話了),所以也就能得到真正的隨機數了。
好了,這篇就講到這裡。