elixir - una - numeros aleatorios en excel
Obtener elementos aleatorios de una lista (4)
Básicamente estoy buscando un equivalente de Elixir de la Array#sample
de Ruby''s Array#sample
. Algo que me permitiría hacer esto:
list = [1,2,3,4,5,6,7]
sample(list)
#=> 4
sample(list, 3)
#=> [6, 2, 5]
Tampoco encontré nada en la Lista de Elixir .
Respuesta actualizada
Como dijo José Valim en su respuesta , en el Elixir 1.1
y superior, ahora puede usar estos métodos para obtener elementos aleatorios de una lista:
-
Enum.random/1
- Para obtener un elemento aleatorio único -
Enum.take_random/2
- Para obtener múltiples elementos aleatorios
Ejemplo:
Enum.random(list) #=> 4
Enum.take_random(list, 3) #=> [3, 9, 1]
Enum.take_random(list, 1) #=> [7]
¡Recuerde llamar :random.seed(:erlang.now)
!
Respuesta original
Todavía no puedo encontrar una manera "adecuada" y "mágica" de hacer esto, pero esto es lo mejor que puedo encontrar:
Para obtener un único elemento aleatorio:
list |> Enum.shuffle |> hd
#=> 4
Nota: Esto da una excepción si la list
está vacía
Para obtener múltiples elementos aleatorios:
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
No hay tal función en Elixir 1.0, por lo que necesita implementarla usted mismo como lo mencionan las otras soluciones. Sin embargo, Enum.random/1
viene con Elixir v1.1: Enum.random/1
Otra forma (solo para muestrear un elemento) es:
list |> Enum.at(:random.uniform(length(list)) - 1)
Posiblemente es preferible sobre el otro método si está trabajando con listas lo suficientemente grandes como para barajar toda la lista podría tener un impacto en el rendimiento.
El comentario de Gazler sobre el uso de :random.seed(:erlang.now)
todavía se aplica.
Si está ejecutando una versión más nueva de Elixir, existe la función Enum.take_random/2
que se agregó en Elixir v1.1.
De la documentation v1.1 de Elixir:
Toma elementos aleatorios de una colección.
Tenga en cuenta que esta función recorrerá toda la colección para obtener la lista secundaria aleatoria de la colección. Si desea el número aleatorio entre dos enteros, la mejor opción es usar el módulo: random.
Entonces, respondiendo a la pregunta, tomar varios elementos de la lista se vería así:
list = [1,2,3,4,5,6,7]
Enum.take_random(list, 3)
#=> [2, 4, 1]
O, para un solo artículo:
list = [1,2,3,4,5,6,7]
Enum.take_random(list, 1)
#=> [1]