2011-10-15 3 views
0

좋아을 arc4random,이에 대한 코드는 다음과 같다 잠시 후에이 오류로 인해 항상 충돌합니다.NSRangeException하고 그래서 배열에서 임의의 이미지를 얻을 arc4random을 사용하고,

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

내 질문은 왜이 엄청나게 큰 숫자가 만들어 졌습니까? arc4random 함수에 문제가 있습니까? 모든 도움을 크게 주시면 감사하겠습니다.

답변

0

arc4random이 0 또는 ray.count의 배수를 반환합니다. 그래서 당신이 그것을 ray.count로 mod 할 때, 0이됩니다. 그런 다음 -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.