簡體   English   中英

如何快速將兩個范圍“鏈接”在一起

[英]How to “link” two ranges together in swift

我有一個產生隨機數輸出的函數(見下文)。 我希望它從0-50或150-400中選擇輸出,但不要介於兩者之間。 我自己找不到太多...因此,如果你們中的任何人可以發布資源或答案,那將非常棒! 非常感謝!

這三個問號是我假設某些操作員會去的地方。

func random() -> UInt32 {
        var range = UInt32(0)...UInt32(50) ??? UInt32(150)...UInt32(400)
        return range.startIndex + arc4random_uniform(range.endIndex - range.startIndex + 1)
}

我嘗試使用+運算符和| 操作員,但沒有運氣。

您不能將范圍的並集傳遞給arc4random_uniform()

您可以做的是在一個間隔內創建一個隨機數,然后將不在第一個范圍內的所有數字“調整”到第二個范圍內:

func random() -> UInt32 {
    var x = arc4random_uniform(302) // 0 .. 301
    if (x > 50) {
        // map 51 .. 301 to 150 .. 400:
        x += 99
    }
    return x
}

這可以推廣到多個范圍(現已針對Swift 3更新):

func randomNumber(fromRanges ranges: Range<UInt32>...) -> UInt32 {
    let totalLength = ranges.reduce(0) { $0 + ($1.upperBound - $1.lowerBound)}
    var rnd = arc4random_uniform(totalLength)
    for range in ranges {
        if rnd < range.upperBound - range.lowerBound {
            return rnd + range.lowerBound
        }
        rnd -= range.upperBound - range.lowerBound
    }
    fatalError("this should never be reached")
}

let x = randomNumber(fromRanges: 0 ..< 51, 150 ..< 401)

范圍的替代方法是只使用while循環,以確保獲得所需范圍內的值。

func randomFunc() -> UInt32 {
    var rand: UInt32 = 401
    while rand < 0 || rand > 400 || (rand > 50 && rand < 150){
        rand = arc4random_uniform(400)
    }
    return rand;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM