2012-05-02 2 views
3

Я зову arc4random в функции в моих IOS приложении для генерации случайных значений от -5 до 6.Почему arc4random возвращает диковинные ценности?

double num; 
for (int i = 0; i < 3; i++) { 
    num = (arc4random() % 11) - 5; 
    NSLog(@"%0.0f", num); 
} 

я получаю следующий вывод из консоли.

2012-05-01 20:25:41.120 Project32[8331:fb03] 0 
2012-05-01 20:25:41.121 Project32[8331:fb03] 1 
2012-05-01 20:25:41.122 Project32[8331:fb03] 4294967295 

0 и 1 являются значениями в пределах диапазона, но wowww, откуда 4294967295?

Изменение arc4random() до rand() устраняет проблему, но rand(), конечно, требует посева.

+1

Не могли бы вы показать декларацию 'num'? Вероятно, но, вероятно, это «неподписанный int»? :) – nacho4d

+1

Я предполагаю, что num является целым числом без знака? – lnafziger

+1

Извините, я просто включил объявление num. –

ответ

7

arc4random() возвращает u_int32_t - это целое число без знака, который не представляет отрицательные значения. Каждый раз, когда arc4random() % 11 появляется с номером 0 ≤ n < 5, вы вычитаете 5 и обертываете их до очень большого количества.

double s может представлять отрицательные числа, конечно, но вы не преобразовывая в double, пока не стало слишком поздно. Палка бросок там:

num = (double)(arc4random() % 11) - 5; 

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

+0

Спасибо! В этом есть смысл. 'arc4random()' возвращает целое число без знака, которое может переполняться с вычитанием. –

4

Попробуйте использовать

arc4random_uniform(11) - 5; 

вместо этого.

От человека странице:

arc4random_uniform() will return a uniformly distributed random number 
less than upper_bound. arc4random_uniform() is recommended over con- 
structions like ``arc4random() % upper_bound'' as it avoids "modulo bias" 
when the upper bound is not a power of two. 
+0

Благодарю вас, что такое «modulo bias»? –

+0

@JustinCase: произнести генератор случайных чисел, созданный только номерами от 1 до 5. Если у вас есть 'rand()% 2', вы с большей вероятностью получите 1, чем 0. Это * modulo bias *. Очевидно, что смещение для 'arc4_random()% upper_bound' (где' upper_bound' не является степенью 2) не так велико, как мой пример, но он все еще существует. – dreamlax

+0

На этой странице также есть пример - http://romhack.wikia.com/wiki/Random_number_generator – danielbeard

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