84

Swift では、0 と 1 の間のランダムな float を取得しようとしていますが、型変換がうまくいかないようです。

func randomCGFloat() -> CGFloat {
    return CGFloat(arc4random()) / UINT32_MAX
}

「CGFloat」は「UInt8」に変換できませんというエラーが表示されます

Xcode 6 を実行しています。

4

11 に答える 11

106

除数を float として初期化してみてください。

CGFloat(Float(arc4random()) / Float(UINT32_MAX))
于 2014-07-31T03:25:47.747 に答える
26

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 ではネイティブの乱数生成が導入されており、これはすべて意味がありません。

于 2016-11-25T17:54:17.420 に答える
16

ここで、フレームワークは 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
    }
}
于 2015-10-12T09:48:27.933 に答える
6

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
于 2014-07-31T04:09:29.057 に答える