Создать случайное число в пределах диапазона?

Возможный дубликат:
Создание случайных чисел в Objective-C

Как создать случайное число, находящееся в пределах диапазона?

Это на самом деле немного сложнее получить действительно правильно, чем большинство людей понимают:

 int rand_lim(int limit) { /* return a random number between 0 and limit inclusive. */ int divisor = RAND_MAX/(limit+1); int retval; do { retval = rand() / divisor; } while (retval > limit); return retval; } 

Попытки, которые просто используют % (или, что эквивалентно, / ), чтобы получить числа в диапазоне, почти неизбежно вводят перекос (т. Е. Некоторые числа будут генерироваться чаще, чем другие).

Что касается того, почему использование % производит искаженные результаты: если диапазон, который вы хотите, является делителем RAND_MAX, перекос неизбежен. Если вы начинаете с небольших чисел, довольно легко понять, почему. Подумайте о том, чтобы принять 10 кусочков конфеты и попытаться разделить его равномерно между тремя детьми. Понятно, что это невозможно сделать – если вы раздадите все конфеты, ближе всего вы сможете добраться до двух детей, чтобы получить три куска конфеты, а один из них получит четыре.

У всех детей есть только один способ получить одинаковое количество конфет: убедитесь, что вы не раздаете последний кусочек конфет.

Чтобы связать это с приведенным выше кодом, давайте начнем с нумерации конфет от 1 до 10 и детей от 1 до 3. Первоначальное подразделение говорит, что, поскольку есть три ребенка, наш делитель равен трем. Затем мы вытаскиваем случайную конфетку из ведра, смотрим на ее число и делим на три и передаем его этому малышу, но если результат больше 3 (т. Е. Мы выбрали номер конфеты 10), мы просто не делаем вообще отбросьте это – мы отбросим его и выберем еще одну конфету.

Конечно, если вы используете современную реализацию C ++ (то есть, которая поддерживает C ++ 11 или новее), вы обычно должны использовать один class distribution из стандартной библиотеки. Вышеупомянутый код наиболее точно соответствует стандарту std::uniform_int_distribution , но стандартная библиотека также включает в себя uniform_real_distribution а также classы для ряда неравномерных распределений (Бернулли, Пуассон, нормальный, может быть, пара других, которых я не помню в данный момент ).

 int rand_range(int min_n, int max_n) { return rand() % (max_n - min_n + 1) + min_n; } 

Для фракций:

 double rand_range(double min_n, double max_n) { return (double)rand()/RAND_MAX * (max_n - min_n) + min_n; } 

http://www.cprogramming.com/tutorial/random.html

Второй пример показывает, как генерировать по диапазону

Для целочисленного значения в диапазоне [min, max):

 double scale = (double) (max - min) / RAND_MAX; int val = min + floor(rand() * scale) 

Я написал это специально в Obj-C для проекта iPhone:

 - (int) intInRangeMinimum:(int)min andMaximum:(int)max { if (min > max) { return -1; } int adjustedMax = (max + 1) - min; // arc4random returns within the set {min, (max - 1)} int random = arc4random() % adjustedMax; int result = random + min; return result; } 

Использовать:

 int newNumber = [aClass intInRangeMinimum:1 andMaximum:100]; 

Добавить соль по вкусу

 +(NSInteger)randomNumberWithMin:(NSInteger)min WithMax:(NSInteger)max { if (min>max) { int tempMax=max; max=min; min=tempMax; } int randomy=arc4random() % (max-min+1); randomy=randomy+min; return randomy; } 

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

  • Неверное завершение кода Xcode 6 не работает
  • Как прокрутить UITableView в определенную позицию
  • Что такое хорошо для?
  • Поиск расстояния от значения RSSI устройства Bluetooth с низким энергопотреблением
  • Как анализировать длительность ISO-8601 в Objective C?
  • Определение типа устройства
  • Ошибка сервера Bootstrap в Xcode IPHONE
  • Сколько стоит разработка приложения для iPhone?
  • iOS 5: Интересно о UIAppearance
  • Как я могу отложить вызов метода на 1 секунду?
  • Почему мой коллега MCSession отключается случайно?
  • Давайте будем гением компьютера.