我有一个产生随机数输出的函数(见下文)。我希望它能从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)
}
我尝试使用+运算符和|操作员,但没有运气。
答案 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;
}