valor una tutorial sean sacar repetirse repetir rango numeros matriz llenar lista generar entre con como aleatorios aleatorio elixir

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:

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]