swift - 如何在 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 的范围循环中生成三个不同的随机数?还是有任何优化的方法来做到这一点?请帮忙。
解决方案
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
}
推荐阅读
- file - Sybase ASE isql - 从输出中删除空白的第一列到 csv 文件
- flutter - 如何强制 ScrollController 重新计算 position.maxExtents?
- android - Gradle 和 mavenLocal 的跨模块依赖
- reactjs - 如何在 Spring Boot 中建立 React JS 和 Apache Kafka 之间的连接?
- angular - 样式绑定使用“样式”。Angular 中子元素的语法
- excel - 如何将数据从工作表复制到另一个工作表?
- docusignapi - 信封:listStatusChanges 不遵守 order_by 参数
- java - SpringBoot:java.io.FileNotFoundException:文件[]无法在文件系统中解析以检查其内容长度
- python - 部署的 Django 3 项目看不到静态文件
- javascript - 如何以角度过滤垫屑