Puis-je définir une plage de nombres lorsque j'utilise arc4random ()? Par exemple 50-100 uniquement.
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).
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é.
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
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);
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.
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).