如何在Swift中生成一个范围内的不同随机数?

tktrz96b  于 2022-12-17  发布在  Swift
关注(0)|答案(6)|浏览(374)

我正面临着一个需要生成三个不同随机数的场景,我知道如何去做,并且已经实现了,但是我想知道是否有任何方法可以优化我的方法,因为我觉得我的方法成本太高了。

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的范围循环中生成三个不同的随机数?或者有没有优化的方法可以做到这一点?请帮助。

bzzcjhmw

bzzcjhmw1#

Set更简单,它保证值的唯一性

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 {

循环中开销最大的部分是,即使已经找到了值,也总是迭代整个数组。

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

但是仍然有一种更有效的语法

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

u2nhd7ah2#

您可以使用一个集合

var randomNumbers = Set<Int>()
while (randomNumbers.count < 3) {
    randomNumbers.update(with: Int.random(in: 1...10))
}

let randomIndex = Array(randomNumbers)
q1qsirdb

q1qsirdb3#

您可以对数组执行shuffle操作并获取前几个n元素

let randomIndex = Array(1...5)
let generatedValue = Array(randomIndex.shuffled().prefix(3))
evrscar2

evrscar24#

您可以使用此扩展名:

extension Array where Element == Int {
    init(randomsCount: Int, minValue: Int, maxValue: Int) {
        self = []        
        var possibleNumbers = Array(minValue ... maxValue)        
        for _ in (0 ..< randomsCount) {
            self.append(possibleNumbers.remove(at: Int.random(in: 0..<possibleNumbers.count)))
        }
    }
}

然后只调用即[Int](randomsCount: 3, minValue: 0, maxValue: 10)来生成具有3个0到10之间的随机整数的数组。
请注意,使用这种方法时,您只需为每个所需的随机数计算一次随机数。

k3fezbri

k3fezbri5#

这是一个辅助函数,用于生成长度为x的随机数。

func randomString(length: Int) -> Int {
    let letters = "0123456789"
    var randomString = String((0..<length).map{ _ in letters.randomElement()!})
    return Int(randomString)

}
dfddblmv

dfddblmv6#

//Example for random number in between 100 (0-99);

import UIKit

let RandomNumber = Int(arc4random_uniform(100))

相关问题