arc4random() положительные и отрицательные числа [дубликаты]

Может кто подскажет как правильно написать

arc4random() %#;

включать не только положительные числа, но и отрицательные числа? Я пытаюсь, чтобы изображение (SKSpriteNode из Sprite Kit) могло случайным образом перемещаться в любом направлении в 2D-среде.


person Krekin    schedule 21.11.2014    source источник
comment
Приведенный вами пример не помог мне понять, как решить проблему. Я должен был предоставить ссылку на него, когда писал о своей проблеме, чтобы другие знали, что я столкнулся с этим, но не нашел его ценным.   -  person Krekin    schedule 21.11.2014


Ответы (2)


Тип возвращаемого значения arc4random() – это u_int32_t, который является unsigned int, поэтому он не может напрямую возвращать отрицательное число.
Вам нужно будет "манипулировать" им, чтобы получить положительный или отрицательный диапазон.

Во-первых, я хотел бы предложить использовать arc4random_uniform() вместо arc4random() %, поскольку это позволяет избежать «смещения по модулю», когда верхняя граница не является степенью двойки.

Что касается вашего вопроса, вы можете сделать следующее, вычтя желаемый диапазон.
Например:

arc4random_uniform(100);  

Дает значения от 0 до 99,
Но если вычесть 50 следующим образом:

arc4random_uniform(100) - 50;  

Теперь мы получим случайное значение от -50 до 49;

РЕДАКТИРОВАТЬ. Если вы присваиваете результаты переменной, я думаю, вам нужно будет ввести результат arc4random_uniform, чтобы избежать предупреждения компилятора, хотя я не уверен, что это необходимо.
Таким образом, это будет выглядеть так:

int randomNumber = (int)arc4random_uniform(100) - 50;
person AMI289    schedule 21.11.2014

включать не только положительные числа, но и отрицательные числа?

Вы не можете. arc4random() возвращает беззнаковое значение (u_int32_t).

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

 int x = arc4random() % 20;

чтобы получить значение в диапазоне [0, 20), вы могли бы вместо этого сказать:

 int x = (arc4random() % 20) - 10;

чтобы получить значение в диапазоне [-10, 10).

person Caleb    schedule 21.11.2014
comment
Привет, приятель, хороший ответ, я начал публиковать свой ответ до того, как ты опубликовал свой, так что не думай, что я пытаюсь «украсть» ответ. в любом случае, просто исправление ваших примеров. ваш первый пример вернет значение от 0 до 19, а второй вернет значение от -10 до 9 - person AMI289; 21.11.2014
comment
@ AMI289 AMI289 Я не согласен с тем, что диапазон равен [0, 20), я просто решил не выбирать эту нитку в интересах простоты. Слово между по своей сути расплывчато относительно того, включает или исключает его границы, поэтому Я отредактирую выше, чтобы явно указать диапазон. - person Caleb; 21.11.2014
comment
Вы должны использовать arc4random_uniform, чтобы избежать смещения по модулю, когда верхняя граница не является степенью двойки. - person 0x141E; 22.11.2014