从列表中获取随机元素

时间:2015-07-04 12:29:04

标签: elixir

我基本上都在寻找Elixir相当于Ruby的Array#sample。可以让我这样做的事情:

list = [1,2,3,4,5,6,7]

sample(list)
#=> 4

sample(list, 3)
#=> [6, 2, 5]

我在Elixir List Docs中找不到任何内容。

4 个答案:

答案 0 :(得分:49)

更新答案

正如JoséValim在his answer中所说的那样,在Elixir 1.1及以上,您现在可以使用这些方法从列表中获取随机元素:

示例:

Enum.random(list)                         #=> 4

Enum.take_random(list, 3)                 #=> [3, 9, 1]
Enum.take_random(list, 1)                 #=> [7]

请务必先致电:random.seed(:erlang.now)

原始答案

我仍然无法找到“正确”和“神奇”的方式来做到这一点,但这是我能做到的最好的方式:

获取单个随机元素:

list |> Enum.shuffle |> hd
#=> 4

注意:如果list为空

,则会出现例外情况

获取多个随机元素:

list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]

答案 1 :(得分:9)

Elixir 1.0中没有这样的功能,所以你需要自己实现它,正如其他解决方案所提到的那样。但是,Enum.random/1即将推出Elixir v1.1:https://hexdocs.pm/elixir/Enum.html#random/1

答案 2 :(得分:5)

另一种方法(仅对一个元素进行采样)是:

list |> Enum.at(:random.uniform(length(list)) - 1)

如果您使用足够大的列表来填充整个列表可能会对性能产生影响,那么可能优于其他方法。

关于使用:random.seed(:erlang.now)

Gazler's comment仍然适用。

答案 3 :(得分:1)

如果您运行的是较新版本的Elixir,则会在Elixir v1.1中添加Enum.take_random/2功能。

来自Elixir的v1.1 documentation

  

从集合中获取随机项目。

     

请注意,此函数将遍历整个集合以获取集合的随机子列表。如果你想要两个整数之间的随机数,最好的选择是使用:random module。

所以,回答这个问题,从列表中取出多个项目看起来像是:

list = [1,2,3,4,5,6,7]
Enum.take_random(list, 3)
#=> [2, 4, 1]

或者,对于单个项目:

list = [1,2,3,4,5,6,7]
Enum.take_random(list, 1)
#=> [1]