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 hay algo como Ruby array.sample
? O si no, ¿podría crearse un método de este tipo utilizando una extensión?
array[random number from 0 to length-1]
, pero no puedo encontrar cómo generar un int aleatorio en forma rápida, lo preguntaría en el desbordamiento de la pila si no estuviera bloqueado :) No quería contaminar la pregunta con medias soluciones cuando tal vez haya algo así como el rubí dearray.sample
Respuestas:
Swift 4.2 y superior
El nuevo enfoque recomendado es un método integrado en el protocolo de recogida:
randomElement()
. Devuelve un opcional para evitar el caso vacío contra el que asumí anteriormente.Si no crea la matriz y no se garantiza el conteo> 0, debe hacer algo como:
Swift 4.1 y abajo
Solo para responder a su pregunta, puede hacer esto para lograr una selección de matriz aleatoria:
Los castings son feos, pero creo que son obligatorios a menos que alguien más tenga otra forma.
fuente
man arc4random
y stackoverflow.com/questions/10984974/…removeRandomElement()
función además derandomElement()
. Se modelaríaremoveFirst()
, pero eliminaría un objeto en un índice aleatorio.0..<array.count
(por múltiples razones, las principales son que no funciona para sectores y es propenso a errores). Puedes hacerlolet randomIndex = array.indices.randomElement()
, seguido delet randomElement = array.remove(at: randomIndex)
. Incluso podrías alinearlolet randomElement = array.remove(at: array.indices.randomElement())
.Refiriéndose a lo que dijo Lucas, podría crear una extensión para la clase Array como esta:
Por ejemplo:
fuente
T
ha sido renombrado aElement
.guard
verificación para ver si la matriz está vacía y luego regresarnil
.arc4random
hace que cualquier ganancia de rendimiento sea completamente insignificante. He actualizado la respuesta.Versión Swift 4 :
fuente
startIndex != 0
En Swift 2.2 esto se puede generalizar para que tengamos:
Primero, implementando
random
propiedad estática paraUnsignedIntegerType
s:Entonces, para
ClosedInterval
s conUnsignedIntegerType
límites:Luego (un poco más complicado), para
ClosedInterval
s conSignedIntegerType
límites (usando los métodos auxiliares que se describen más adelante):... donde
unsignedDistanceTo
,unsignedDistanceFromMin
y losplusMinIntMax
métodos auxiliares se pueden implementar de la siguiente manera:Finalmente, para todas las colecciones donde
Index.Distance == Int
:... que puede optimizarse un poco para enteros
Range
:fuente
También puede usar la función aleatoria () incorporada de Swift para la extensión:
fuente
Otra sugerencia de Swift 3
fuente
Siguiendo a otros responden pero con soporte Swift 2.
Swift 1.x
Swift 2.x
P.ej:
fuente
Una implementación funcional alternativa con verificación de matriz vacía.
fuente
Aquí hay una extensión en matrices con una verificación de matriz vacía para mayor seguridad:
Puede usarlo tan simple como esto :
Si prefiere un Framework que también tenga algunas características más útiles, entonces consulte HandySwift . Puede agregarlo a su proyecto a través de Carthage y luego usarlo exactamente como en el ejemplo anterior:
Además, también incluye una opción para obtener múltiples elementos aleatorios a la vez :
fuente
Swift 3
importar GameKit
fuente
Swift 3: simple y fácil de usar.
Crear matriz
Crear color aleatorio
Establece ese color en tu objeto
Aquí hay un ejemplo de un
SpriteKit
proyecto que actualiza aSKLabelNode
con un azarString
:fuente
Si quieres poder obtener más de un elemento aleatorio de tu matriz sin duplicados , GameplayKit te tiene cubierto:
Tiene un par de opciones de aleatoriedad, consulte GKRandomSource :
fuente
Creo que usar GKRandomSource.sharedRandom () de GameKit funciona mejor para mí.
o puede devolver el objeto en el índice aleatorio seleccionado. Asegúrese de que la función devuelva una Cadena primero y luego devuelva el índice de la matriz.
Corto y al grano.
fuente
Hay un método incorporado
Collection
ahora:Si desea extraer hasta
n
elementos aleatorios de una colección, puede agregar una extensión como esta:Y si desea que sean únicos, puede usar a
Set
, pero los elementos de la colección deben cumplir con elHashable
protocolo:fuente
El último código swift3 prueba que funciona bien
fuente
Descubrí una forma muy diferente de hacerlo utilizando las nuevas características introducidas en Swift 4.2.
declaramos una función con parámetros que toman una matriz de cadenas y devuelven una cadena.
Luego tomamos ArrayOfStrings en una variable.
Básicamente está barajando el conjunto de cadenas y luego también tiene una selección aleatoria del número del número total de conteo y luego devuelve el índice aleatorio del conjunto aleatorio.
fuente