如何"链接"两个范围在一起迅速

时间:2014-07-31 11:04:06

标签: swift range

我有一个产生随机数输出的函数(见下文)。我希望它能从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)
}

我尝试使用+运算符和|操作员,但没有运气。

2 个答案:

答案 0 :(得分:4)

您无法将范围联合传递给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)

答案 1 :(得分:0)

范围的替代方法是只使用while循环以确保获得所需范围内的值。

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