gpt4 book ai didi

swift - 如何快速将 "link"两个范围放在一起

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:34 25 4
gpt4 key购买 nike

我有一个生成随机数输出的函数(见下文)。我希望它从 0-50 或 150-400 中选择输出,但不能介于两者之间。我自己找不到太多关于它的信息......所以如果你们中的任何人都可以发布资源或答案那就太棒了!提前致谢!

三个问号是我假设某些运算符(operator)会去的地方。

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)

关于swift - 如何快速将 "link"两个范围放在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25057305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com