Swift aléatoire flotter entre 0 et 1
Rapide, je vais essayer d'obtenir un aléatoire flotter entre 0 et 1, mais je n'arrive pas à obtenir la conversion de type de travail.
func randomCGFloat() -> CGFloat {
return CGFloat(arc4random()) / UINT32_MAX
}
Je suis un 'CGFloat" n'est pas convertible 'UInt8' erreur
L'Exécution De Xcode 6.
Vous devez vous connecter pour publier un commentaire.
Essayez d'initialiser le diviseur comme un float ainsi, à la:
Float
– justeCGFloat(arc4random()) / CGFloat(UInt32.max)
.C'est l'extension pour nombres aléatoires de Int, Double, Float, CGFloat
Swift 3 & 4 syntaxe
Utilisation :
return Float(arc4random()) / 0xFFFFFFFF
donne maintenant un avertissement:'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'
. Une idée de comment résoudre cet avertissement? Je suis en train de penser à diviser parFloat(UInt32.max)
à la place.Mise à jour De sable Chapman réponse pour Swift 3:
Maintenant, vous pouvez dire des choses comme
(-1.0...1.0).random()
.MODIFIER je pense qu'aujourd'hui (Swift 4) j'aimerais écrire quelque chose comme ceci:
NOTE Swift 4.2 introduit natif de génération de nombre aléatoire et tout cela est discutable.
swift 4.2 :
Ici, le cadre fait un bon travail lors de la génération de nombre aléatoire des données de Swift:
https://github.com/thellimist/SwiftRandom/blob/master/SwiftRandom/Randoms.swift
Generic iOS device
. Le 0xffffffff ne rentre pas à l'intérieur d'un Int. Essayez plutôt ceci CGFloat(UInt32.max)Ci-dessous est une extension sur le
IntervalType
type pour ce faire:Avec cette extension, vous pouvez utiliser l'intervalle de syntaxe pour la génération d'un intervalle et ensuite obtenir une valeur aléatoire dans l'intervalle:
Plus
Si vous cherchez à faire de même pour
Int
s, alors vous pouvez utiliser l'extension suivante sur laCollectionType
protocole:Int
s n'utilisez pas leIntervalType
. Ils utilisentRange
à la place. L'avantage de le faire sur leCollectionType
type est qu'il est automatiquement reporté à l'Dictionary
etArray
types.Exemples:
.random()
surInt
s,Dictionary
s etArray
sCe jmduke suggéré semble fonctionner dans l'aire de Jeux avec un petit changement dans la fonction:
et la raison pour laquelle à partir de la swift doc et comme l'a noté drewag: type de conversion doit être explicite, l'exemple de la doc est:
Dans le cas où vous avez besoin d' [Double]. Entre 0 et 1. C'est tout.
Basé sur YannickSteph la réponse de
Pour le faire fonctionner pour n'importe quel type à virgule flottante, comme
Double
,Float
,CGFloat
, etc., vous pouvez faire une extension pour leBinaryFloatingPoint
type:Détails
Xcode: 9.2, Swift 4
Solution
Utilisation
Totalité De L'Échantillon
Résultats