2016-01-21 2 views
2

Je suis en train de créer un temps aléatoire pour une notification à se produire ce qui est entre deux fois, une gamme ...temps aléatoire entre deux fois (une gamme) iOS SDK

Je voudrais iOS créer un entre 9h30 et 11h30. Je pensais utiliser le générateur de nombres aléatoires pour les heures et un autre pour les minutes et ensuite faire des vérifications pour m'assurer qu'il est entre 09h30 et 11h30 mais je pensais qu'il pourrait y avoir un moyen plus facile de le faire sans trop s'impliquer. toute aide serait grandement appréciée.

+0

Cette heure doit-elle être un nombre pair de minutes ou de secondes, ou voulez-vous qu'elle soit vraiment aléatoire, c'est-à-dire des fractions de secondes? – matt

Répondre

7

Obtenez un NSTimeInterval pour la période entre les deux dates; obtenir un seul nombre aléatoire dans cette plage; obtenir une nouvelle date par décalage par rapport au premier.

/*! 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]; 
} 

Addendum, un an et demi plus tard: une édition a souligné que drand48 deux a une séquence bien définie (y compris la première valeur du lancement du programme) et n'est pas un nombre aléatoire particulièrement avancé Générateur. Je recommande srand48 ou seed48 au lancement du programme si le premier est un problème, et quelque chose comme ((double)arc4random()/UINT32_MAX) à la place de drand48 si vous voulez éliminer les deux problèmes - bien que cela réduit le nombre de valeurs de sortie que vous pouvez atteindre de 2^48 à 2^32 , il devrait toujours vous obtenir des décisions sub-second dans un délai raisonnable.