作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我想生成一个介于 1 和 100 之间的随机数,但我不想包括 42。如果不重复随机方法直到它不是 42,我将如何做到这一点。
最佳答案
Updated for Swift 5.1
var nums = [Int](1...100)
nums.remove(at: 42)
let random = Int(arc4random_uniform(UInt32(nums.count)))
print(nums[random])
Range
的这个扩展在您想要排除超过 1 个值时确实提供了一种解决方案。
extension ClosedRange where Element: Hashable {
func random(without excluded:[Element]) -> Element {
let valid = Set(self).subtracting(Set(excluded))
let random = Int(arc4random_uniform(UInt32(valid.count)))
return Array(valid)[random]
}
}
例子
(1...100).random(without: [40,50,60])
我认为第二个解决方案的计算复杂度为 O(n)
,其中 n 是范围中包含的元素数。
这里的假设是调用者提供的排除值不超过 n 个。
关于swift - 如何在不使用 while 循环的情况下生成不包括一个的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343444/
我是一名优秀的程序员,十分优秀!