Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 从列表中获取随机元素_Elixir - Fatal编程技术网

Elixir 从列表中获取随机元素

Elixir 从列表中获取随机元素,elixir,Elixir,我基本上是在寻找一种相当于Ruby的长生不老药。让我这样做的东西: list = [1,2,3,4,5,6,7] sample(list) #=> 4 sample(list, 3) #=> [6, 2, 5] 我在这两个列表中都没有找到任何内容。更新的答案 正如JoséValim在《Elixir 1.1》及以上版本中所说,您现在可以使用以下方法从列表中获取随机元素: -用于获取单个随机元素 -用于获取多个随机元素 示例: list |> Enum.shuffle |

我基本上是在寻找一种相当于Ruby的长生不老药。让我这样做的东西:

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

sample(list)
#=> 4

sample(list, 3)
#=> [6, 2, 5]
我在这两个列表中都没有找到任何内容。

更新的答案 正如JoséValim在《Elixir 1.1》及以上版本中所说,您现在可以使用以下方法从列表中获取随机元素:

  • -用于获取单个随机元素
  • -用于获取多个随机元素
示例:

list |> Enum.shuffle |> hd
#=> 4
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
Enum.random(list)#=>4
Enum.take_random(列表,3)#=>[3,9,1]
Enum.take_random(列表,1)#=>[7]
记得先调用
:random.seed(:erlang.now)


原始答案 我仍然无法找到一种“适当的”和“神奇的”方法来做到这一点,但这是我能想到的最好的方法:

获取单个随机元素:

list |> Enum.shuffle |> hd
#=> 4
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
注意:如果
列表
为空,则会出现例外情况

用于获取多个随机元素:

list |> Enum.shuffle |> hd
#=> 4
list |> Enum.shuffle |> Enum.take(3)
#=> [7, 1, 5]
另一种方法(仅对一种元素进行采样)是:

如果您使用的列表足够大,以至于对整个列表进行无序排列可能会对性能产生影响,那么可能比其他方法更可取


关于使用
:random.seed(:erlang.now)
仍然适用。

Elixir 1.0中没有此类函数,因此您需要按照其他解决方案所述自己实现它。但是,
Enum.random/1
将与Elixir v1.1一起提供:

如果您运行的是Elixir的较新版本,则在Elixir v1.1中添加了
Enum.take_random/2
函数

来自Elixir的v1.1:

从集合中随机获取项目

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

因此,回答这个问题时,从列表中选择多个项目如下所示:

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库的一部分。如果您收到类似“warning:erlang:now/0:Disprecated BIF”这样的警告,请参阅ERTS用户指南的“erlang中的时间和时间更正”一章以了解更多信息。改为这样的种子:
:random.seed(:os.timestamp)
从Elixir 1.2开始,您不需要调用
:random.seed/1
,因为Elixir为此使用了新模块。您好,这是上述代码的作者
Enum.random
/
take_random
最初被称为
sample
(就像在Ruby中一样),并被合并到Elixir 1.1,后来被重命名。值得一提的是,关于可枚举的大小,它是O(n),使用一个版本的算法。这是我对Elixir标准库的第一次贡献-非常好的经验,大家在评论、讨论和整个工作流程方面都有很好的标准。我真的建议你在那里捐款。