2012-01-02 1 views
3

Я использую этот код, где значение 'length' равно '50'.Awkward arc4random results

newX = (arc4random()%(lenght+1)) - (lenght/2); 
newY = (arc4random()%(lenght+1)) - (lenght/2); 
NSLog(@"Creature Move X:%f, Y:%f", newX, newY); 

Но в отладчике я получаю такие вещи, как:

2012-01-02 21:10:50.794 Kipos[28833:207] Creature Move X:4294967296.000000, Y:4294967296.000000 
2012-01-02 21:10:50.896 Kipos[28833:207] Creature Move X:4294967296.000000, Y:12.000000 

Что происходит?

newX и newY являются поплавки:

float newX; 
float newY; 
+0

Очень странно ... Каков тип '' lenght' '(typo btw), и можете ли вы NSLog его одновременно с этим журналом? – joerick

+0

Длина (опечатка * facepalm *) - это int. Уже решена. Но спасибо! –

ответ

5

arc4random возвращает без знака Int (и, предположительно, length также без знака). Измените свой код, например.

newX = (float)((int)(arc4random() % (length + 1))) - (length/2)); 

во избежание переполнения при вычитании.

Обратите внимание, что я добавил также явный прилив для результата, что не является абсолютно необходимым, но делает код более понятным.

+0

Из интереса, где вы искали это? Мой ленивый googling не смог найти возвращаемый тип '%'. –

+0

Итак, я думаю, что здесь 'length' также был неподписанным? В противном случае компилятор должен был преобразовать левый операнд в подписанный int перед выполнением вычитания? Или я ошибаюсь? – joerick

+0

@joerick: да, я думаю, вы, вероятно, правы –

 Смежные вопросы

  • Нет связанных вопросов^_^