arc4random()

 原文地址:http://bj007.blog.51cto.com/1701577/544006

今天在iPhone開發過程中,遇到一個需要生成隨機數的問題。很快rand()和arc4random()都進入了考慮範圍,但選擇的時候感覺有點爲難。之前的時候可能沒有思索就隨便挑一個用了,不過這次良心發現不能太隨便了。rand() 和arc4random()到底應該如何取捨呢?調查了下,發現下文很好地解答了這個問題。

在iPhone中有幾個內嵌的隨機數發生器,很多人的第一反應可能就是在調用如下函數後使用rand():

    srandom(time(NULL)); 


但是……,rand()實際並不是一個真正的僞隨機數發生器,random()會相對好點,但也不算理想。幸運的是iPhone上還有其他的選擇。個人來說我首選arc4random() ,原因就是它是一個真正的僞隨機算法,而且範圍是rand()的兩倍。


在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值則是 0x100000000 (4294967296),從而有更好的精度。此外,使用arc4random()還不需要生成隨機種子,因爲第一次調用的時候就會自動生成。

通過arc4random() 獲取0到x-1之間的整數的代碼如下:

    int value = arc4random() % x; 



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

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


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

最後如果想生成一個浮點數,可以在項目中定義如下宏:

    #define ARC4RANDOM_MAX      0x100000000 

然後就可以使用arc4random() 來獲取0到100之間浮點數了(精度是rand()的兩倍),代碼如下:

    double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);    



另外兩種 OC 的僞隨機數生成:
原文地址:
http://www.cnblogs.com/xuling/archive/2012/02/28/2370692.html 


 CCRANDOM_0_1() cocos2d中使用 ,範圍是[0,1]
 使用方法:
 float random = CCRANDOM_0_1() * 5; //[0,5]   CCRANDOM_0_1() 取值範圍是[0,1]

random() 需要初始化時設置種子
srandom((unsigned int)time(time_t *)NULL); //初始化時,設置下種子就好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章