我基本上都在寻找Elixir相当于Ruby的Array#sample
。可以让我这样做的事情:
list = [1,2,3,4,5,6,7]
sample(list)
#=> 4
sample(list, 3)
#=> [6, 2, 5]
我在Elixir List Docs中找不到任何内容。
答案 0 :(得分:49)
正如JoséValim在his answer中所说的那样,在Elixir 1.1
及以上,您现在可以使用这些方法从列表中获取随机元素:
Enum.random/1
- 获取单个随机元素Enum.take_random/2
- 获取多个随机元素示例:强>
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]