Случайное время между двумя временами (диапазон) iOS SDK

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

Я бы хотел, чтобы iOS создавала время между 9:30 и 11:30.

Я думал о том, чтобы использовать генератор случайных чисел для часов, а другой - для минут, а затем сделал несколько проверок, чтобы убедиться, что это между 9:30 и 11:30, но подумал, что может быть более простой способ сделать это без слишком увлекаться любая помощь будет принята с благодарностью.

1 ответ

Решение

Получить NSTimeInterval за период между двумя датами; получить одно случайное число в этом диапазоне; получить новую дату по смещению от первой.

/*! Returns a random date in the range [start, end) 

    @param start The lower bound for random dates; returned dates will be equal to
    or after the start date.

    @param end The upper bound for random dates; dates will be before the end date.

    @returns A random date.
*/
- (NSDate *)randomDateBetweenStart:(NSDate *)start end:(NSDate *)end
{
    NSTimeInterval window = [end timeIntervalSinceDate:start];
    NSTimeInterval randomOffset = drand48() * window;
    return [start dateByAddingTimeInterval:randomOffset];
}

Дополнение, полтора года спустя: редактирование указало, что drand48 оба имеют четко определенную последовательность (включая первое значение после запуска программы) и не являются особенно продвинутым генератором случайных чисел. рекомендую srand48 или же seed48 при запуске программы, если первая проблема, и что-то вроде ((double)arc4random() / UINT32_MAX) на месте drand48 если вы хотите устранить обе проблемы - хотя это уменьшает количество выходных значений, которые вы можете набрать, с 2^48 до 2^32, оно все равно должно принимать решения за доли секунды в течение любого разумного интервала времени.

Другие вопросы по тегам