web-dev-qa-db-fra.com

Comment sélectionner une plage de valeurs lors de l'utilisation de arc4random ()

Puis-je définir une plage de nombres lorsque j'utilise arc4random ()? Par exemple 50-100 uniquement.

39
NextRev

Comme indiqué dans d'autres articles ci-dessous, il est préférable d'utiliser arc4random_uniform. (Lorsque cette réponse a été écrite à l'origine, arc4random_uniform N'était pas disponible). En plus d'éviter le biais modulo de arc4random() % x, il évite également un problème d'ensemencement avec arc4random Lorsqu'il est utilisé récursivement dans des délais courts.

arc4random_uniform(4)

générera 0, 1, 2 ou 3. Ainsi, vous pourriez utiliser:

arc4random_uniform(51)

et ajoutez simplement 50 au résultat pour obtenir une plage entre 50 et 100 (inclus).

69
RunLoop

Pour développer le commentaire de JohnK.

Il est suggéré d'utiliser la fonction suivante pour renvoyer un nombre aléatoire à distance:

arc4random_uniform(51)

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

Ensuite, vous pouvez ajouter vos limites inférieures à ceci comme:

arc4random_uniform(51) + 50

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

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

arc4random_uniform (upper_bound) renverra un nombre aléatoire uniformément distribué inférieur à upper_bound. arc4random_uniform () est recommandé par rapport aux constructions comme `` arc4random ()% upper_bound '' car il évite le "biais modulo" lorsque la limite supérieure n'est pas une puissance de deux.

En bref, vous obtenez un nombre aléatoire plus uniformément distribué.

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

Générera randon number entre 10 et 30, c'est à dire. 11,12,13,14......29

18
Vaibhav Saran

Vous pouvez utiliser ce code pour générer des valeurs aléatoires avec une 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);
3
handiansom

Dans Swift vous pouvez utiliser ceci (inspiré par la réponse de @ 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 un nombre entier aléatoire.

1
kurtanamo

Dans de nombreuses situations, 10 à 30 signifierait inclusif (comprend 10 et 30) ...

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

Remarquez que la différence toNumber - fromNumber est maintenant de 21 ... (20 + 1), ce qui donne les résultats possibles de 0 à 20 (inclus) qui, ajoutés à fromNumber (10), entraînent de 10 à 30 (inclus).

0
Mike Young