Elixir/Erlang Random/Rand Seed 是否需要在每个进程上调用?

1 random erlang seed elixir

在 Hashrockets 博客文章“在 Erlang 和 Elixir 中生成随机数的冒险”中,Dorian Karter 提到打开和关闭erl会话允许他从 PRNG 重现相同的输出random:uniform().

结果默认情况下,随机对每个虚拟机实例使用相同的种子。

例如:

第一节

1> random:uniform().
0.4435846174457203
Run Code Online (Sandbox Code Playgroud)

第二节

1> random:uniform().
0.4435846174457203
Run Code Online (Sandbox Code Playgroud)

我似乎无法在文档中找到,或者我在网上的搜索是否适用于整个虚拟机或仅调用种子方法的进程。

问题:在 Elixir 中,您是否需要为每个 erlang 进程调用种子(对于两者randomrand)函数?或者一个调用 ~somewhere~ 是否适用于整个 Erlang 运行时?

Tan*_*gui 6

rand模块取代了该random模块:

将使用改进的 rand 模块来代替该模块。

但是对于rand模块:

如果进程调用uniform/0、uniform/1或uniform_real/0而不首先设置种子,则使用默认算法自动调用seed/1并创建一个非常量种子。

因此,在使用 .VM 重新启动 VM 后,您将得到不同的结果rand:uniform/0

但是,如果您将随机性用于加密目的,那么您应该使用crypto:strong_rand_bytes/1.