cocos2d 隨機數設計

通常我們需要獲得隨機數的時候,假如直接使用了random()就會發現”爲什麼每次打開程序隨機出來結果的順序都一樣?”,這是因爲我們獲得的隨機數實際上都是僞隨機數,所以在random之前需要使用srandom()函數獲得一個seed來進行隨機算法,並且通常是使用srandom(time(NULL)),把時間作爲參數是爲了獲得的seed每次都不一樣,當然理論上肯定是不一樣的 XD

那麼有沒有更便捷的隨機方法呢?

答案就是使用arc4random,它就藏在C語言標準庫(Standard C Library)當中.文檔對於它的描述是:

The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8 bit S-Boxes. The S-Boxes can be in about (21700) states. The arc4random() function returns pseudo-random numbers in the range of 0 to (232)-1, and therefore has twice the range of rand(3) and random(3) .

arc4random既使用了arc4加密算法避免seed重複,並且比random的取值範圍(2**31)-1整整大了一倍

在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值則是 0×100000000 (4294967296),從而有更好的精度。此外,使用arc4random()還不需要生成隨機種子,因爲第一次調用的時候就會自動生成。
通過arc4random() 獲取0到x-1之間的整數的代碼如下:
int value = arc4random() % x;

獲取1到x之間的整數的代碼如下:

int value = (arc4random() % x) + 1;

其中,根據預算優先級括號實際是不需要的,不過我還是對括號格外小心。

最後如果想生成一個浮點數,可以在項目中定義如下宏:
#define ARC4RANDOM_MAX 0×100000000
然後就可以使用arc4random() 來獲取0到100之間浮點數了(精度是rand()的兩倍),代碼如下:
double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);、


http://tenggangren.blog.163.com/blog/static/10585792020121141516591/


發佈了55 篇原創文章 · 獲贊 5 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章