如何在Elixir中生成一个随机数?

Ser*_*pia 56 random integer elixir

我需要生成一个随机数.我发现了这个Enum.random/1函数,但是它需要一个可列举的数字,例如列表或数字范围.

这是获得随机数的唯一方法吗?

Ser*_*pia 98

您可以rand无缝地从Elixir代码中调用Erlang的模块.

random_number = :rand.uniform(n)
Run Code Online (Sandbox Code Playgroud)

将给出1 <= x <= n的随机数


Mic*_*aev 30

&Enum.random/1

Enum.random(0..n)0 to n随机生成

您也可以将列表作为参数发送

  • 请注意,`Enum.random / 1`的文档在传递范围时不会遍历整个范围,因此`Enum.random(1..1000000000000)`和`Enum.random(1 .. 1000)是相同的。 (5认同)
  • 我没有投票,但这可能是投票,因为问题是要求的方式不同于你的建议. (3认同)

Ken*_*itt 10

正如另一个答案所暗示的那样,您可以使用Enum.random/1但实际上不需要传递它“数字列表”(正如问题,最初编写的那样)假设的。

正如其他答案的评论者指出的那样,状态文档Enum.random/1

如果将范围传递给函数,则该函数将在范围限制之间选择一个随机值,而不遍历整个范围(从而在恒定时间和恒定内存中执行)。

因此,这些应该(至少大致)等效:

:rand.uniform(n)
Run Code Online (Sandbox Code Playgroud)
1..n |> Enum.random()
Run Code Online (Sandbox Code Playgroud)

System.unique_integer/1根据您想要“随机”数字的确切原因,您也许也可以使用。以下“返回一个在当前运行时实例中唯一的整数”:

System.unique_integer()
Run Code Online (Sandbox Code Playgroud)

一个唯一的正整数(可用于生成“随机名称”):

System.unique_integer([:positive])
Run Code Online (Sandbox Code Playgroud)

唯一的单调递增整数:

System.unique_integer([:monotonic])
Run Code Online (Sandbox Code Playgroud)