Swift では、0 と 1 の間のランダムな float を取得しようとしていますが、型変換がうまくいかないようです。
func randomCGFloat() -> CGFloat {
return CGFloat(arc4random()) / UINT32_MAX
}
「CGFloat」は「UInt8」に変換できませんというエラーが表示されます
Xcode 6 を実行しています。
Swift では、0 と 1 の間のランダムな float を取得しようとしていますが、型変換がうまくいかないようです。
func randomCGFloat() -> CGFloat {
return CGFloat(arc4random()) / UINT32_MAX
}
「CGFloat」は「UInt8」に変換できませんというエラーが表示されます
Xcode 6 を実行しています。
除数を float として初期化してみてください。
CGFloat(Float(arc4random()) / Float(UINT32_MAX))
Swift 3に対する Sandy Chapman の回答の更新:
extension ClosedRange where Bound : FloatingPoint {
public func random() -> Bound {
let range = self.upperBound - self.lowerBound
let randomValue = (Bound(arc4random_uniform(UINT32_MAX)) / Bound(UINT32_MAX)) * range + self.lowerBound
return randomValue
}
}
のようなことが言えるようになり(-1.0...1.0).random()
ました。
編集私は今日(Swift 4)次のように書くと思います:
extension ClosedRange where Bound : FloatingPoint {
public func random() -> Bound {
let max = UInt32.max
return
Bound(arc4random_uniform(max)) /
Bound(max) *
(upperBound - lowerBound) +
lowerBound
}
}
注Swift 4.2 ではネイティブの乱数生成が導入されており、これはすべて意味がありません。
ここで、フレームワークは Swift で乱数データを生成するのに適しています: https://github.com/thellimist/SwiftRandom/blob/master/SwiftRandom/Randoms.swift
public extension Int {
/// SwiftRandom extension
public static func random(lower: Int = 0, _ upper: Int = 100) -> Int {
return lower + Int(arc4random_uniform(UInt32(upper - lower + 1)))
}
}
public extension Double {
/// SwiftRandom extension
public static func random(lower: Double = 0, _ upper: Double = 100) -> Double {
return (Double(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower
}
}
public extension Float {
/// SwiftRandom extension
public static func random(lower: Float = 0, _ upper: Float = 100) -> Float {
return (Float(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower
}
}
public extension CGFloat {
/// SwiftRandom extension
public static func random(lower: CGFloat = 0, _ upper: CGFloat = 1) -> CGFloat {
return CGFloat(Float(arc4random()) / Float(UINT32_MAX)) * (upper - lower) + lower
}
}
jmduke が提案したことは、機能に小さな変更を加えて Playground で機能するようです。
func randomCGFloat() -> Float {
return Float(arc4random()) / Float(UInt32.max)
}
そして、迅速なドキュメントから、および drawag: 型変換が明示的でなければならない理由として、ドキュメントの例は次のとおりです。
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double