objective-c 中隨機數的用法 3種:arc4random() 、random()、CCRANDOM_0_1()


oc 中隨機數的用法(arc4random() 、random()、CCRANDOM_0_1()

1)、arc4random() 比較精確不需要生成隨即種子

       使用方法 :

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

                 int value = arc4random() % x; 


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

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

 

       2)、CCRANDOM_0_1() cocos2d中使用 ,范圍是[0,1]

       使用方法:

                 float random = CCRANDOM_0_1() * 5; //[0,5]   CCRANDOM_0_1() 取值范圍是[0,1]

 

       3)、random() 需要初始化時設置種子

      使用方法:

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

 

 

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

 

 

-(float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2
{
   
int startVal = num1*10000;
   
int endVal = num2*10000;

   
int randomValue = startVal +(arc4random()%(endVal - startVal));
   
float a = randomValue;

   
return(a /10000.0);
}



在一些產品的源代碼中,經常會發現有這樣的語句,

srand(unsigned(time(NULL)));

為什么要這樣做呢,其實很簡單。

1.  time()函數表示返回1970-1-1 00:00:00 到當前時間的秒數,而time(NULL)表示獲取一個時間,准確的說,獲取一個指針的地址。

2.  srand()函數是產生隨機數種子的。在產生隨機數 rand()被調用的時候,他會查看:如果用戶之前調用過 srand(seed)的話,他會重新調用一遍 srand(seed)以產生隨機數種子;如果發現沒有調用過 srand(seed)的話,會自動調用 srand(1)一次。所以,如果希望rand()每次調用產生的值都不一樣,就需要每次調用srand(seed)一次,而且seed不能相同。

綜合上述兩點,那就很明了了。

srand(unsigned(time(NULL)))表示產生隨機數種子以保證rand()調用的時候不會出現重復的隨機值。


objective-c 中隨機數的用法 (3種:arc4random() 、random()、CCRANDOM_0_1() )

1、隨機數的使用

     1)、arc4random() 比較精確不需要生成隨即種子

       使用方法 :

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

                 int value = arc4random() % x; 


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

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

 

       2)、CCRANDOM_0_1() cocos2d中使用 ,范圍是[0,1]

       使用方法:

                 float random = CCRANDOM_0_1() * 5; //[0,5]   CCRANDOM_0_1() 取值范圍是[0,1]

 

       3)、random() 需要初始化時設置種子

      使用方法:

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

 

今天在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);   

 

通過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);



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM