假设我有一个数组,我想随机选择一个元素。
最简单的方法是什么?
最明显的方法是array[random index]。但也许有一些类似ruby的array。sample?如果没有,可以通过使用扩展来创建这样的方法吗?
假设我有一个数组,我想随机选择一个元素。
最简单的方法是什么?
最明显的方法是array[random index]。但也许有一些类似ruby的array。sample?如果没有,可以通过使用扩展来创建这样的方法吗?
当前回答
Swift 4.2及以上版本
新的推荐方法是Collection协议上的内置方法:randomElement()。它返回一个可选选项,以避免前面假设的空情况。
let array = ["Frodo", "Samwise", "Merry", "Pippin"]
print(array.randomElement()!) // Using ! knowing I have array.count > 0
如果你不创建数组,也不保证计数> 0,你应该这样做:
if let randomElement = array.randomElement() {
print(randomElement)
}
Swift 4.1及以下版本
为了回答你的问题,你可以这样做来实现随机数组选择:
let array = ["Frodo", "Samwise", "Merry", "Pippin"]
let randomIndex = Int(arc4random_uniform(UInt32(array.count)))
print(array[randomIndex])
演员阵容很难看,但我相信他们是必须的,除非有人有别的办法。
其他回答
你可以使用Swift内置的random()函数以及扩展:
extension Array {
func sample() -> Element {
let randomIndex = Int(rand()) % count
return self[randomIndex]
}
}
let array = [1, 2, 3, 4]
array.sample() // 2
array.sample() // 2
array.sample() // 3
array.sample() // 3
array.sample() // 1
array.sample() // 1
array.sample() // 3
array.sample() // 1
重复Lucas所说的,你可以像这样创建Array类的扩展:
extension Array {
func randomItem() -> Element? {
if isEmpty { return nil }
let index = Int(arc4random_uniform(UInt32(self.count)))
return self[index]
}
}
例如:
let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16]
let myItem = myArray.randomItem() // Note: myItem is an Optional<Int>
我发现使用GameKit的gkrandomsource . sharerandom()最适合我。
import GameKit
let array = ["random1", "random2", "random3"]
func getRandomIndex() -> Int {
let randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(array.count)
return randomNumber
或者可以返回所选随机下标处的对象。确保函数首先返回String,然后返回数组的索引。
return array[randomNumber]
言简意赅。
跟随其他人的回答,但有Swift 2支持。
快1.倍
extension Array {
func sample() -> T {
let index = Int(arc4random_uniform(UInt32(self.count)))
return self[index]
}
}
快2.倍
extension Array {
func sample() -> Element {
let index = Int(arc4random_uniform(UInt32(self.count)))
return self[index]
}
}
例如:
let arr = [2, 3, 5, 7, 9, 11, 13, 17, 19, 23, 29, 31]
let randomSample = arr.sample()
Swift 4.2及以上版本
新的推荐方法是Collection协议上的内置方法:randomElement()。它返回一个可选选项,以避免前面假设的空情况。
let array = ["Frodo", "Samwise", "Merry", "Pippin"]
print(array.randomElement()!) // Using ! knowing I have array.count > 0
如果你不创建数组,也不保证计数> 0,你应该这样做:
if let randomElement = array.randomElement() {
print(randomElement)
}
Swift 4.1及以下版本
为了回答你的问题,你可以这样做来实现随机数组选择:
let array = ["Frodo", "Samwise", "Merry", "Pippin"]
let randomIndex = Int(arc4random_uniform(UInt32(array.count)))
print(array[randomIndex])
演员阵容很难看,但我相信他们是必须的,除非有人有别的办法。