Get Random Element(s) from a List

Sheharyar picture Sheharyar · Jul 4, 2015 · Viewed 13.4k times · Source

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.

Answer

Sheharyar picture Sheharyar · Jul 4, 2015

Updated Answer

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:

Example:

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!


Original Answer

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]