Неудобные результаты arc4random

Я использую этот код, где значение «длина» равно «50».

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;

person David Da Silva Contín    schedule 02.01.2012    source источник
comment
Очень странно... что за тип 'lenght' (кстати, опечатка), и можете ли вы NSLog вести его одновременно с этим логом?   -  person joerick    schedule 03.01.2012
comment
Длина (опечатка facepalm) — целое число. Уже решено. Но спасибо!   -  person David Da Silva Contín    schedule 03.01.2012


Ответы (1)


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

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

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

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

person Paul R    schedule 02.01.2012
comment
Ради интереса, где вы искали, чтобы узнать это? Мой ленивый гуглинг не смог найти возвращаемый тип %. - person Paul.s; 03.01.2012
comment
Я так понимаю, здесь length тоже не подписано? В противном случае компилятор должен был преобразовать левый операнд в целое число со знаком, прежде чем выполнять вычитание? Или это у меня неправильно? - person joerick; 03.01.2012
comment
Это сработало! Спасибо! Также сработало предложение Пола (изменить «2» на «2.00»): newX = arc4random()%(length+1) - (length/2.00); newY = arc4random()%(length+1) - (length/2.00); - person David Da Silva Contín; 03.01.2012
comment
@Paul.s: это просто обычные правила типов для выражений в C - unsigned % unsigned даст беззнаковый результат - person Paul R; 03.01.2012
comment
Кстати, что бы вы предложили вместо использования %f в NSLog? - person David Da Silva Contín; 03.01.2012
comment
В %f нет ничего плохого, но я предпочитаю %g для регистрации, отладки и т. д. - person Paul R; 03.01.2012
comment
Спасибо всем за помощь :) Это сводило меня с ума! - person David Da Silva Contín; 03.01.2012