2012-12-29 6 views
2

을 던지고,이 같은 난수를 생성하는 arc4random를 사용arc4random적인 Cocos2D 게임에서 거대한 수

float x = (arc4random()%10 - 5)*delta; 

NSLog(@"x: %f", x); 

(델타 예약 된 업데이트 방법 업데이트 사이의 시간입니다) 나는 그들을 그렇게 체크하고있다.

내가 얻을 수의 대부분은 다음과 같습니다

2012-12-29 15:37:18.206 Jumpy[1924:907] x: 0.033444 

또는

2012-12-29 15:37:18.247 Jumpy[1924:907] x: 0.033369 

그러나

가끔 이런 식으로 번호를 얻을 몇 가지 이유 :

2012-12-29 15:37:18.244 Jumpy[1924:907] x: 71658664.000000 

편집 : 델타는 거의 항상 다음과 같습니다.

2012-12-29 17:01:26.612 Jumpy[2059:907] delta: 0.016590 

숫자가 -5에서 5 사이의 숫자를 반환해야한다고 생각했습니다. 왜 이런 식으로 숫자를 얻는거야?

답변

6

arc4random returns a u_int32_t.u_ 부분은 서명되지 않았 음을 알려줍니다. 따라서 괄호 안에있는 모든 연산자는 부호없는 산술을 사용합니다.

당신이 부호없는 32 비트 연산을 사용하여 2 - 5 뺄셈을 수행하는 경우, 당신은 32 + 2 얻을 - (는 "엄청난 숫자") 3 = 4294967293-5 = 2 32.

빼기를 수행하기 전에 서명 된 유형으로 전송하십시오. 배포 대상이 나중에 아이폰 OS 4.3의 경우 또한, arc4random_uniform을 선호 : 당신이 범위에 포함 할 -5와 5 경우

float x = ((int)arc4random_uniform(10) - 5) * delta; 

, 당신 때문에 범위 [-5,5, 10 대신 11을 사용할 필요가

float x = ((int)arc4random_uniform(11) - 5) * delta; 
0

arc4random % 105보다 작아지고 나중에 음수로 작업하게됩니다.

delta의 값은 무엇입니까?

1

arc4randomu_int32_t, 부호 형 반환 (포함)는 소자 (11)를 포함한다. 모듈러스는 또한 0에서 9 사이의 숫자를 얻을 수있는 부호없는 산술을 사용하여 수행됩니다 (그런데 do do this do do do use arc4random_uniform). 그런 다음 부호가없는 값으로 해석되는 5를 빼면 언더 플로우로 인해 양의 값이 커질 수 있습니다.

해결 방법은 부호가있는 변수 또는 접미사 (예 : 5L)에 저장하여 명시 적으로 5를 입력하는 것입니다.