Что не так с этой функцией рандомизации? - PullRequest
5 голосов
/ 15 июля 2009

Я даю ему 0 и 400, и иногда мне возвращаются значения выше 400. Это не имеет смысла.

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / RAND_MAX) * (high - low)) + low;
}

это на самом деле фрагмент, который я нашел в сети. Может быть, кто-то может увидеть ошибку там?

Ответы [ 4 ]

7 голосов
/ 15 июля 2009

Страница справочника для arc4random указывает, что возвращаемое значение может находиться в любом месте диапазона, действительного для u int32 (т.е. 0 to (2**32)-1). Это означает, что вы захотите разделить на 0xFFFFFFFF вместо RAND_MAX, что, как я полагаю, меньше (однако это зависит от библиотеки, поэтому вам нужно будет точно проверить, что это такое).

Таким образом, ваша функция должна стать:

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (((float) arc4random() / 0xFFFFFFFFu) * (high - low)) + low;
}
6 голосов
/ 15 июля 2009
  • arc4random возвращает псевдослучайное значение от нуля до (2 ^ 32 - 1)
  • RAND_MAX имеет значение по умолчанию (2 ^ 31 - 1)

Таким образом, функция, вероятно, умножает диапазон (high - low) на коэффициент 2 для случайных значений в диапазоне 0 - 800.

3 голосов
/ 15 июля 2009

На iPhone значение RAND_MAX равно 0x7fffffff (2147483647), а функция arc4random () вернет максимальное значение 0x100000000, поэтому (4294967296) / (2147483647) = 2 ..... 2 * (400-0) + 0 = 800! максимальное значение, которое метод может вернуть

0 голосов
/ 15 июля 2009

Более простой вариант будет:

- (float)randomValueBetween:(float)low andValue:(float)high {
    return (arc4random() % * (high - low)) + low;
}

Поскольку вы уже выполняете операцию с модом, почему бы не выполнить ее непосредственно в интересующем вас диапазоне?

Кроме того, почему вы передаете поплавки (и возвращаете поплавки), если вы когда-либо передаете только круглые числа? Целые числа более эффективны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...