2011-10-15 68 views
0

好了,所以我用arc4random得到一個隨機圖像從一個數組,這樣做的代碼如下:NSRangeException和arc4random

//ray is the array that stores my images 
int pic = arc4random() % ray.count; 
tileImageView.image = [ray objectAtIndex:pic-1]; 
NSLog(@"Index of used image: %d", pic-1); 

我打電話這段代碼多次,它的工作原理一段時間,但一段時間後,它總是崩潰,因爲這個錯誤的:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** - [__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 39]' 

我的問題是,爲什麼這個可笑的大量產生的? arc4random函數有問題嗎?任何幫助將不勝感激

回答

0

arc4random返回0或ray.count的偶數倍。所以當你用ray.count對它進行修改時,你得到0.然後你從中減去1,得到-1,這意味着一個非常大的無符號整數。

+0

啊,非常感謝你!所以正確的做法是'int pic = arc4random()%(ray.count -1);',否? – kopproduction

+0

@kopproduction:如果你想從數組中返回一個隨機項,你不需要減去任何東西。模數運算符已經確保該索引小於ray.count。 – Chuck

+0

好的,再次感謝,我不知道:) – kopproduction

0

問題是,因爲你的pic-1結構會在一段時間內產生-1(這是4294967295的無符號形式)。你需要擺脫pic-1,而不是簡單地使用pic。

2

您還可以使用arc4random_uniform(upper_bound)函數來生成一個範圍內的隨機數。以下內容將生成一個介於0和73之間的數字。

arc4random_uniform(74) 

arc4random_uniform(UPPER_BOUND)避免模偏置在手冊頁描述:

arc4random_uniform() will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like ``arc4random() % upper_bound'' as it avoids "modulo bias" when the upper bound is not a power of two.