首页 > 解决方案 > 如何在 Swift 的范围内生成不同的随机数?

问题描述

我面临一个场景,我必须生成三个不同的随机数。我知道如何做到这一点并且已经实现了它。但我想知道有什么方法可以优化我的方法,因为我觉得我的方法成本太高。

var randomIndex = [Int]()
var generatedValue = [Int]()
var c = 0
randomIndex.removeAll()
while true {
    let randomValue = Int.random(in: 1 ... 10)
    generatedValue.append(randomValue)
    print(randomValue)
    for i in 0 ... generatedValue.count - 1{
        if randomValue != generatedValue[i]{
            randomIndex.append(randomValue)
            c += 1
        }
    }
    if c >= 3 {
        break
    }
}

这里我声明了两个不同的数组,使用一个无限循环和一个变量来跟踪值。是否有任何函数可以在从 0 到 2 的范围循环中生成三个不同的随机数?还是有任何优化的方法来做到这一点?请帮忙。

标签: swift

解决方案


ASet更简单,它保证唯一值

var randomIndex = Set<Int>()

while randomIndex.count < 3 {
    randomIndex.insert(Int.random(in: 1 ... 10))
}

另一种方法是创建一个值数组,选择一个随机元素并从数组中删除该元素

var randomValues = Set<Int>()
var valueArray = Array(1...10)
for _ in 0..<3 {
    guard let randomElement = valueArray.randomElement() else { break }
    randomValues.insert(randomElement)
    valueArray.remove(at: valueArray.firstIndex(of: randomElement)!)
}

关于有什么方法可以优化我的方法,代码中的for循环非常昂贵。

首先,基于索引的循环的推荐语法是

for i in 0 ..< generatedValue.count {

但实际上你不需要索引,所以快速枚举更好

for value in generatedValue {
    if randomValue != value {

循环中最昂贵的部分是整个数组总是被迭代,即使已经找到了值。至少添加一条break退出循环的语句

for value in generatedValue {
    if randomValue != value {
        randomIndex.append(randomValue)
        c += 1
        break
    }
}

但是还有更高效的语法

if !generatedValue.contains(randomValue) {
    randomIndex.append(randomValue)
    c += 1  
}

推荐阅读