从列表中获取随机元素
Get Random Element(s) from a List
我基本上是在寻找与 Ruby 的 Array#sample
等效的 Elixir。让我这样做的东西:
list = [1,2,3,4,5,6,7]
sample(list)
#=> 4
sample(list, 3)
#=> [6, 2, 5]
我也没有在 Elixir List Docs 中找到任何内容。
更新答案
正如 José Valim 在 中所说,在 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)
!
原答案
我仍然找不到 'proper' 和 'magical' 的方法,但这是我能想到的最好的方法:
获取单个随机元素:
list |> Enum.shuffle |> hd
#=> 4
注意:如果 list
为空
,则会出现异常
获取多个随机元素:
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
另一种方式(仅对一个元素进行采样)是:
list |> Enum.at(:random.uniform(length(list)) - 1)
如果您使用的列表足够大,打乱整个列表可能会对性能产生影响,则可能优于其他方法。
关于使用 :random.seed(:erlang.now)
仍然适用。
Elixir 1.0中没有这个功能,需要自己实现,其他方案都提到了。但是,Enum.random/1
随 Elixir v1.1 一起提供:https://hexdocs.pm/elixir/Enum.html#random/1
如果您是 运行 Elixir 的新版本,Elixir v1.1 中添加了 Enum.take_random/2
功能。
来自 Elixir 的 v1.1 documentation:
Takes random items from a collection.
Notice this function will traverse the whole collection to get the random sublist of collection. If you want the random number between two integers, the best option is to use the :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]
我基本上是在寻找与 Ruby 的 Array#sample
等效的 Elixir。让我这样做的东西:
list = [1,2,3,4,5,6,7]
sample(list)
#=> 4
sample(list, 3)
#=> [6, 2, 5]
我也没有在 Elixir List Docs 中找到任何内容。
更新答案
正如 José Valim 在 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)
!
原答案
我仍然找不到 'proper' 和 'magical' 的方法,但这是我能想到的最好的方法:
获取单个随机元素:
list |> Enum.shuffle |> hd
#=> 4
注意:如果 list
为空
获取多个随机元素:
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
另一种方式(仅对一个元素进行采样)是:
list |> Enum.at(:random.uniform(length(list)) - 1)
如果您使用的列表足够大,打乱整个列表可能会对性能产生影响,则可能优于其他方法。
:random.seed(:erlang.now)
仍然适用。
Elixir 1.0中没有这个功能,需要自己实现,其他方案都提到了。但是,Enum.random/1
随 Elixir v1.1 一起提供:https://hexdocs.pm/elixir/Enum.html#random/1
如果您是 运行 Elixir 的新版本,Elixir v1.1 中添加了 Enum.take_random/2
功能。
来自 Elixir 的 v1.1 documentation:
Takes random items from a collection.
Notice this function will traverse the whole collection to get the random sublist of collection. If you want the random number between two integers, the best option is to use the :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]