Elija un elemento aleatorio de una matriz

Resuelto Fela asked hace 10 años • 16 respuestas

Supongamos que tengo una matriz y quiero elegir un elemento al azar.

¿Cuál sería la forma más sencilla de hacer esto?

La forma obvia sería array[random index]. ¿Pero tal vez haya algo como el de Ruby array.sample? O si no, ¿podría crearse dicho método mediante el uso de una extensión?

Fela avatar Jun 03 '14 03:06 Fela
Aceptado

Rápido 4.2 y superior

El nuevo enfoque recomendado es un método integrado en el protocolo Collection: randomElement(). Devuelve un opcional para evitar el caso vacío que asumí anteriormente.

let array = ["Frodo", "Samwise", "Merry", "Pippin"]
print(array.randomElement()!) // Using ! knowing I have array.count > 0

Si no crea la matriz y no se garantiza un recuento > 0, debe hacer algo como:

if let randomElement = array.randomElement() { 
    print(randomElement)
}

Swift 4.1 y anteriores

Sólo para responder a su pregunta, puede hacer esto para lograr una selección de matriz aleatoria:

let array = ["Frodo", "Samwise", "Merry", "Pippin"]
let randomIndex = Int(arc4random_uniform(UInt32(array.count)))
print(array[randomIndex])

Los castings son feos, pero creo que son necesarios a menos que alguien tenga otra opción.

Lucas Derraugh avatar Jun 05 '2014 05:06 Lucas Derraugh

Siguiendo lo que dijo Lucas, podrías crear una extensión para la clase Array como esta:

extension Array {
    func randomItem() -> Element? {
        if isEmpty { return nil }
        let index = Int(arc4random_uniform(UInt32(self.count)))
        return self[index]
    }
}

Por ejemplo:

let myArray = [1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16]
let myItem = myArray.randomItem() // Note: myItem is an Optional<Int>
Phae Deepsky avatar Jun 07 '2014 22:06 Phae Deepsky

Versión rápida 4 :

extension Collection where Index == Int {

    /**
     Picks a random element of the collection.

     - returns: A random element of the collection.
     */
    func randomElement() -> Iterator.Element? {
        return isEmpty ? nil : self[Int(arc4random_uniform(UInt32(endIndex)))]
    }

}
Andrey Gordeev avatar Sep 15 '2016 09:09 Andrey Gordeev