xcode c语言 随机数,如何在苹果的SWIFT语言中生成随机数?

9f26b0cfc16363a9f2b640f4b2c6f4f8.png

慕田峪7331174

 SWIFT 3.0更新arc4randomSWIFT运行良好,但基函数仅限于32位整数类型(Int是64位在iPhone5S和现代Mac电脑上)。下面是一个泛型函数,用于一个可由整数文字表示的类型的随机数:public func arc4random(_ type: T.Type) -> T {

    var r: T = 0

    arc4random_buf(&r, MemoryLayout.size)

    return r}我们可以使用这个新的泛型函数来扩展UInt64,添加边界参数和减轻模块偏差。(这是直接从ARC 4随机.c)public extension UInt64 {

    public static func random(lower: UInt64 = min, upper: UInt64 = max) -> UInt64 {

        var m: UInt64

        let u = upper - lower        var r = arc4random(UInt64.self)

        if u > UInt64(Int64.max) {

            m = 1 + ~u        } else {

            m = ((max - (u * 2)) + 1) % u        }

        while r 

            r = arc4random(UInt64.self)

        }

        return (r % u) + lower    }}这样我们就可以扩展Int64对于相同的参数,处理溢出:public extension Int64 {

    public static func random(lower: Int64 = min, upper: Int64 = max) -> Int64 {

        let (s, overflow) = Int64.subtractWithOverflow(upper, lower)

        let u = overflow ? UInt64.max - UInt64(~s) : UInt64(s)

        let r = UInt64.random(upper: u)

        if r > UInt64(Int64.max)  {

            return Int64(r - (UInt64(~lower) + 1))

        } else {

            return Int64(r) + lower        }

    }}为了完成这个家庭.。private let _wordSize = __WORDSIZEpublic extension UInt32 {

    public static func random(lower: UInt32 = min, upper: UInt32 = max) -> UInt32 {

        return arc4random_uniform(upper - lower) + lower    }}public extension Int32 {

    public static func random(lower: Int32 = min, upper: Int32 = max) -> Int32 {

        let r = arc4random_uniform(UInt32(Int64(upper) - Int64(lower)))

        return Int32(Int64(r) + Int64(lower))

    }}public extension UInt {

    public static func random(lower: UInt = min, upper: UInt = max) -> UInt {

        switch (_wordSize) {

            case 32: return UInt(UInt32.random(UInt32(lower), upper: UInt32(upper)))

            case 64: return UInt(UInt64.random(UInt64(lower), upper: UInt64(upper)))

            default: return lower        }

    }}public extension Int {

    public static func random(lower: Int = min, upper: Int = max) -> Int {

        switch (_wordSize) {

            case 32: return Int(Int32.random(Int32(lower), upper: Int32(upper)))

            case 64: return Int(Int64.random(Int64(lower), upper: Int64(upper)))

            default: return lower        }

    }}在这之后,我们终于可以这样做了:let diceRoll = UInt64.random(lower: 1, upper: 7)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值