数组 – 在包含范围内生成唯一随机数的数组
发布时间:2020-12-14 02:29:46 所属栏目:百科 来源:网络整理
导读:我正在尝试在Apple Swift(iOS)中编写一个函数,该函数将生成任意给定数量的独特随机数,这些随机数在给定的包含范围内,比如介于0和10之间.因此,如果我说我想要0和0之间的5个唯一随机数10,它将返回一个包含[7,10,2,3,0]或[7,8,0]等的数组. 我有这个部分与: //
我正在尝试在Apple
Swift(iOS)中编写一个函数,该函数将生成任意给定数量的独特随机数,这些随机数在给定的包含范围内,比如介于0和10之间.因此,如果我说我想要0和0之间的5个唯一随机数10,它将返回一个包含[7,10,2,3,0]或[7,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)) 现在我想添加将我不想要的范围内的单个数字列入黑名单的功能.说我仍然想要0到10之间的5个唯一随机数但是我不希望它包括8. 那部分导致无限循环(25%的时间或更多),我无法弄清楚为什么?这就是我所拥有的: var blackListNum = 8 // Returns an array of unique numbers func uniqueRandoms(numberOfRandoms: 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,maxNum: 10,checkBlackList: true)) 我知道我的功能远没有效率,因为我刚刚开始学习Swift,但我想保持它类似,因为我想了解它是如何工作的.我不想简单地复制和粘贴别人更有效的解决方案而不理解它.我刚刚学习了变量,常量,if,while,for等语句和其他基础知识,并希望保持这一点.
您可以使用Set来存储所有随机数,直到达到预期的random数量,从而使您的生活更轻松:
func uniqueRandoms(numberOfRandoms: Int,maxNum: UInt32) -> [Int] { var uniqueNumbers = Set<Int>() while uniqueNumbers.count < numberOfRandoms { uniqueNumbers.insert(Int(arc4random_uniform(maxNum + 1)) + minNum) } return Array(uniqueNumbers).shuffle } print(uniqueRandoms(5,maxNum: 10)) func uniqueRandoms(numberOfRandoms: Int,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 Array(uniqueNumbers).shuffle } uniqueRandoms(3,blackList: 8) // [0,7] 你需要这个扩展来洗牌结果: extension Array { var shuffle:[Element] { var elements = self for index in 0..<elements.count { let anotherIndex = Int(arc4random_uniform(UInt32(elements.count-index)))+index if anotherIndex != index { swap(&elements[index],&elements[anotherIndex]) } } return elements } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |