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.
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