Swift随机浮点数介于0和1之间

 掩飾獨殇_389 发布于 2022-12-31 13:24

在Swift中,我试图获得0到1之间的随机浮点数,但我似乎无法使类型转换工作.

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

我得到'CGFloat'不能转换为'UInt8'错误

运行Xcode 6.

7 个回答
  • 这是Int,Double,Float,CGFloat 随机数 的扩展

    Swift 3&4语法

    import Foundation
    import CoreGraphics
    
    // MARK: Int Extension
    
    public extension Int {
    
        /// Returns a random Int point number between 0 and Int.max.
        static var random: Int {
            return Int.random(n: Int.max)
        }
    
        /// Random integer between 0 and n-1.
        ///
        /// - Parameter n:  Interval max
        /// - Returns:      Returns a random Int point number between 0 and n max
        static func random(n: Int) -> Int {
            return Int(arc4random_uniform(UInt32(n)))
        }
    
        ///  Random integer between min and max
        ///
        /// - Parameters:
        ///   - min:    Interval minimun
        ///   - max:    Interval max
        /// - Returns:  Returns a random Int point number between 0 and n max
        static func random(min: Int, max: Int) -> Int {
            return Int.random(n: max - min + 1) + min
    
        }
    }
    
    // MARK: Double Extension
    
    public extension Double {
    
        /// Returns a random floating point number between 0.0 and 1.0, inclusive.
        static var random: Double {
            return Double(arc4random()) / 0xFFFFFFFF
        }
    
        /// Random double between 0 and n-1.
        ///
        /// - Parameter n:  Interval max
        /// - Returns:      Returns a random double point number between 0 and n max
        static func random(min: Double, max: Double) -> Double {
            return Double.random * (max - min) + min
        }
    }
    
    // MARK: Float Extension
    
    public extension Float {
    
        /// Returns a random floating point number between 0.0 and 1.0, inclusive.
        static var random: Float {
            return Float(arc4random()) / 0xFFFFFFFF
        }
    
        /// Random float between 0 and n-1.
        ///
        /// - Parameter n:  Interval max
        /// - Returns:      Returns a random float point number between 0 and n max
        static func random(min: Float, max: Float) -> Float {
            return Float.random * (max - min) + min
        }
    }
    
    // MARK: CGFloat Extension
    
    public extension CGFloat {
    
        /// Randomly returns either 1.0 or -1.0.
        static var randomSign: CGFloat {
            return (arc4random_uniform(2) == 0) ? 1.0 : -1.0
        }
    
        /// Returns a random floating point number between 0.0 and 1.0, inclusive.
        static var random: CGFloat {
            return CGFloat(Float.random)
        }
    
        /// Random CGFloat between 0 and n-1.
        ///
        /// - Parameter n:  Interval max
        /// - Returns:      Returns a random CGFloat point number between 0 and n max
        static func random(min: CGFloat, max: CGFloat) -> CGFloat {
            return CGFloat.random * (max - min) + min
        }
    }
    

    使用 :

    let randomNumDouble  = Double.random(min: 0.00, max: 23.50)
    let randomNumInt     = Int.random(min: 56, max: 992)
    let randomNumFloat   = Float.random(min: 6.98, max: 923.09)
    let randomNumCGFloat = CGFloat.random(min: 6.98, max: 923.09)
    

    2022-12-31 13:25 回答
  • jmduke建议的似乎在Playground中有效,但功能上有一点变化:

    func randomCGFloat() -> Float {
        return Float(arc4random()) /  Float(UInt32.max)
    }
    

    以及从swift doc和drewag所指出的原因:类型转换必须是显式的,doc中的示例是:

    let three = 3
    let pointOneFourOneFiveNine = 0.14159
    let pi = Double(three) + pointOneFourOneFiveNine
    // pi equals 3.14159, and is inferred to be of type Double
    

    2022-12-31 13:27 回答
  • 迅捷4.2:

    let randomFloat = Float.random(in: 0..<1)
    

    2022-12-31 13:27 回答
  • 尝试将除数初始化为浮点数,a la:

    CGFloat(Float(arc4random()) / Float(UINT32_MAX))
    

    2022-12-31 13:27 回答
  • 这里框架在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
        }
    }
    

    2022-12-31 13:27 回答
  • 更新Sandy Chapman对Swift 3 的回答:

    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引入了本机随机数生成,所有这一切都变得毫无意义.

    2022-12-31 13:27 回答
  • 以下是IntervalType执行此操作的类型的扩展:

    extension IntervalType {
        public func random() -> Bound {
            let range = (self.end as! Double) - (self.start as! Double)
            let randomValue = (Double(arc4random_uniform(UINT32_MAX)) / Double(UINT32_MAX)) * range + (self.start as! Double)
            return randomValue as! Bound
        }
    }
    

    使用此扩展,您可以使用区间语法生成间隔,然后在该区间中获取随机值:

    (0.0...1.0).random()
    

    加成

    如果您希望对Ints 执行相同操作,则可以在CollectionType协议上使用以下扩展名:

    extension CollectionType {
        public func random() -> Self._Element {
            if let startIndex = self.startIndex as? Int {
                let start = UInt32(startIndex)
                let end = UInt32(self.endIndex as! Int)
                return self[Int(arc4random_uniform(end - start) + start) as! Self.Index]
            }
            var generator = self.generate()
            var count = arc4random_uniform(UInt32(self.count as! Int))
            while count > 0 {
                generator.next()
                count = count - 1
            }
            return generator.next() as! Self._Element
        }
    }
    

    Ints不要使用IntervalType.他们Range改用.在CollectionType类型上执行此操作的好处是它会自动转移到DictionaryArray类型.

    例子:

    (0...10).random()               // Ex: 6
    ["A", "B", "C"].random()        // Ex: "B"
    ["X":1, "Y":2, "Z":3].random()  // Ex: (.0: "Y", .1: 2)
    

    2022-12-31 13:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有