Генератор случайных чисел с входа - PullRequest
1 голос
/ 02 июня 2011

Я новичок в разработке XCode, и я хотел бы знать, как я могу генерировать случайные числа из 2 входных данных.

В IB у меня есть 2 текстовых поля (с цифровым блоком), которые указывают интервалчисла для генерации (т.е. от 3 до 7).Я хотел бы знать, как я получаю входные данные из 2 текстовых полей и делаю метод, который генерирует случайные числа из этих входных данных.

Ответы [ 2 ]

5 голосов
/ 09 октября 2012

Есть много проблем, связанных с попыткой сгенерировать действительно случайное число. Обратите внимание, например, что такие функции, как rand () и random () генерируют последовательности чисел на основе «начального значения». Это означает, что если начальное значение одинаково, последовательность сгенерированных чисел будет одинаковой. Существуют различные способы использования «случайных» начальных чисел, т. Е. С использованием текущей даты и времени, но надежность и безопасность этих методов сомнительны.

По мере развития генераторов чисел эти проблемы решаются, и поэтому более поздние генераторы обычно лучше, чем более ранние: rand обычно не так случайны, как random , и random не так случайно, как arc4random .

Текущая проблема с arc4random () , которая задокументирована на их страницах руководства, состоит в том, что использование вычисления модуля - как в "arc4random ()% UPPER_LIMIT" - может привести к статистическому смещению, если UPPER_LIMIT не четное число. По этой причине в семейство arc4random была добавлена ​​новая функция под названием arc4random_uniform . Он генерирует равномерно распределенные случайные числа независимо от верхнего предела, и его довольно просто использовать.

Используя ваш пример выше, я бы порекомендовал вам попробовать сгенерировать ваше случайное число, например так:

int value = low_bound + arc4random_uniform(width + 1);
2 голосов
/ 02 июня 2011
int low_bound = 3;
int high_bound = 7;
int width = high_bound - low_bound; // 4
int value = low_bound + arc4random() % (width + 1); // 3 + 0..4

Кроме того, читайте границы полей, что-то вроде bound = [[field text] intValue].


Если у вас возникли проблемы с подключением полей ввода к коду, вам следует прочитать руководство по Какао.Есть несколько способов сделать это, один из самых простых - объявить свойства для текстовых полей в классе контроллера:

@interface Controller : UIViewController {}
@property(retain) IBOutlet UITextField *lowerBoundField;
@property(retain) IBOutlet UITextField *upperBoundField;
@end

Затем вы можете подключить текстовые поля в Интерфейсном Разработчике к этим выходам и работатьс ними в коде, подобном следующему:

- (void) generateNumber {
    int lowerBound = [[lowerBoundField text] intValue];
    …
}

Это предполагает, что мы говорим о Cocoa Touch.В настольном какао ситуация аналогичная, просто детали будут другими.

...