Question

Puis-je définir une plage de numéros lors de l'utilisation arc4random ()? Par exemple 50-100 seulement.

Était-ce utile?

La solution

Comme indiqué dans d'autres postes ci-dessous, il est préférable d'utiliser arc4random_uniform. (Lorsque cette réponse a été écrit à l'origine, arc4random_uniform n'était pas disponible). En plus d'éviter le biais modulo de arc4random() % x, elle évite aussi un problème avec l'ensemencement arc4random lorsqu'il est utilisé de façon récursive dans des délais très courts.

arc4random_uniform(4)

génère 0, 1, 2 ou 3. Ainsi, vous pouvez utiliser:

arc4random_uniform(51)

et simplement ajouter 50 au résultat pour obtenir une fourchette comprise entre 50 et 100 (y compris).

Autres conseils

Pour élargir commentaires Johnk.

Il est recommandé d'utiliser la fonction suivante pour renvoyer un nombre aléatoire ont varié:

arc4random_uniform(51)

qui renvoie un nombre aléatoire dans la plage 0 à 50.

Ensuite, vous pouvez ajouter vos limites inférieures à ce que:

arc4random_uniform(51) + 50

qui renvoie un nombre aléatoire dans la plage 50 à 100.

La raison pour laquelle nous utilisons arc4random_uniform(51) sur arc4random() % 51 est d'éviter la modulo de polarisation. Ceci est mis en évidence dans la page de manuel comme suit:

  

arc4random_uniform (upper_bound) retourne un nombre aléatoire uniformément distribué moins de upper_bound. arc4random_uniform () est recommandé sur des constructions comme `` arc4random ()% upper_bound « » car elle évite « biais de modulo » lorsque la limite supérieure ne soit pas une puissance de deux.

En bref vous obtenez un nombre aléatoire généré plus uniformément répartie.

int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

va générer randon number entre 10 et 30, à savoir 11,12,13,14......29

Vous pouvez utiliser ce code pour générer des valeurs aléatoires avec plage:

//range from 50 to 100
int num1 = (arc4random() % 50) + 50; or
int num1 = arc4random_uniform(50) + 50;

//range from 0-100
int num1 = arc4random() % 100; or
int num1 = arc4random_uniform(100);

Dans Swift vous pouvez l'utiliser (inspiré par réponse @Justyn )

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) +  UInt32(rangeFrom)
    return Int(theKey)
}

vous donnera toujours une gamme aléatoire entier.

Dans de nombreuses situations 10-30 signifierait inclus, (y compris 10 et 30) ...

int fromNumber = 10;
int toNumber = 30;
toNumber ++;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

Notez la différence de ToNumber - fromNumber est maintenant 21 ... (20 + 1), qui donne les résultats possibles de 0 à 20 (inclusivement) qui, lorsqu'il est ajouté à fromNumber (10) se traduit par 10 thru 30 (inclus) <. / p>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top