数组 – 在包含范围内生成唯一随机数的数组

发布时间:2019-04-24 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了数组 – 在包含范围内生成唯一随机数的数组脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在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
    }
}

总结

以上是脚本之家为你收集整理的数组 – 在包含范围内生成唯一随机数的数组全部内容,希望文章能够帮你解决数组 – 在包含范围内生成唯一随机数的数组所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。
标签: