I'm basically looking for an Elixir equivalent of Ruby's Array#sample
. Something that would let me do this:
list = [1,2,3,4,5,6,7]
sample(list)
#=> 4
sample(list, 3)
#=> [6, 2, 5]
I didn't find anything in the Elixir List Docs either.
As José Valim said in his answer, in Elixir 1.1
and above, you can now use these methods to get random element(s) from a list:
Enum.random/1
- For getting single random elementEnum.take_random/2
- For getting multiple random elementsExample:
Enum.random(list) #=> 4
Enum.take_random(list, 3) #=> [3, 9, 1]
Enum.take_random(list, 1) #=> [7]
Remember to call :random.seed(:erlang.now)
first!
I'm still unable to find a 'proper' and 'magical' way to do this, but this is the best I could come up:
For getting a single random element:
list |> Enum.shuffle |> hd
#=> 4
Note: This gives an exception if the list
is empty
For getting multiple random elements:
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]