gpt4 book ai didi

arrays - 生成包含范围内的唯一随机数数组

转载 作者:搜寻专家 更新时间:2023-10-30 22:22:20 24 4
gpt4 key购买 nike

我正在尝试在 Apple Swift (iOS) 中编写一个函数,该函数将生成给定范围内任意给定数量的唯一随机数,例如 0 到 10 之间。所以如果我说我想要 5 个唯一随机数在 0 到 10 之间,它会返回一个包含 [7, 10, 2, 3, 0] 或 [7, 10, 2, 8, 0] 等的数组。

我有那部分工作:

// Returns an array of unique numbers
func uniqueRandoms(numberOfRandoms: Int, minNum: Int, maxNum: UInt32) -> [Int] {

var uniqueNumbers = [Int]()

while uniqueNumbers.count < numberOfRandoms {

let randomNumber = Int(arc4random_uniform(maxNum + 1)) + minNum
var found = false

for var index = 0; index < uniqueNumbers.count; ++index {
if uniqueNumbers[index] == randomNumber {
found = true
break
}
}

if found == false {
uniqueNumbers.append(randomNumber)
}

}

return uniqueNumbers
}

print(uniqueRandoms(5, minNum: 0, maxNum: 10))

现在我想添加将我不想要的范围内的单个号码列入黑名单的功能。假设我仍然想要 5 个介于 0 和 10 之间的唯一随机数,但我不希望它包含 8。

那部分会导致无限循环(25% 以上的时间或更多),我不明白为什么?这是我的:

var blackListNum = 8

// Returns an array of unique numbers
func uniqueRandoms(numberOfRandoms: Int, minNum: Int, maxNum: UInt32, checkBlackList: Bool = false) -> [Int] {

var uniqueNumbers = [Int]()

while uniqueNumbers.count < numberOfRandoms {

let randomNumber = Int(arc4random_uniform(maxNum + 1)) + minNum
var found = false

for var index = 0; index < uniqueNumbers.count; ++index {
if checkBlackList == false {
if uniqueNumbers[index] == randomNumber {
found = true
break
}
} else {
if uniqueNumbers[index] == randomNumber || uniqueNumbers[index] == blackListNum {
found = true
break
}
}
}

if found == false {
uniqueNumbers.append(randomNumber)
}

}

return uniqueNumbers
}

print(uniqueRandoms(5, minNum: 0, maxNum: 10, checkBlackList: true))

我知道我的函数远非高效,因为我才刚刚开始学习 Swift,但我想保持它的相似性,因为我想了解它是如何工作的。我不想简单地复制和粘贴别人更有效的解决方案而不理解它。我刚刚学习了变量、常量、if、while、for 等语句和其他基础知识,并希望坚持下去。

最佳答案

您可以使用 Set 存储所有随机数,直到达到预期的随机数,让您的生活变得更轻松:

func uniqueRandoms(numberOfRandoms: Int, minNum: Int, maxNum: UInt32) -> [Int] {
var uniqueNumbers = Set<Int>()
while uniqueNumbers.count < numberOfRandoms {
uniqueNumbers.insert(Int(arc4random_uniform(maxNum + 1)) + minNum)
}
return uniqueNumbers.shuffled()
}

print(uniqueRandoms(numberOfRandoms: 5, minNum: 0, maxNum: 10))

func uniqueRandoms(numberOfRandoms: Int, minNum: Int, maxNum: UInt32, blackList: Int?) -> [Int] {
var uniqueNumbers = Set<Int>()
while uniqueNumbers.count < numberOfRandoms {
uniqueNumbers.insert(Int(arc4random_uniform(maxNum + 1)) + minNum)
}
if let blackList = blackList {
if uniqueNumbers.contains(blackList) {
while uniqueNumbers.count < numberOfRandoms+1 {
uniqueNumbers.insert(Int(arc4random_uniform(maxNum + 1)) + minNum)
}
uniqueNumbers.remove(blackList)
}
}
return uniqueNumbers.shuffled()
}

uniqueRandoms(numberOfRandoms: 3, minNum: 0, maxNum: 10, blackList: 8) // [0, 10, 7]

关于arrays - 生成包含范围内的唯一随机数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773593/

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