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

Posted

技术标签:

【中文标题】Elixir/Erlang Random/Rand Seed 是不是需要在每个进程上调用?【英文标题】:Does Elixir/Erlang Random/Rand Seed need to be called on each process?Elixir/Erlang Random/Rand Seed 是否需要在每个进程上调用? 【发布时间】:2021-11-28 23:34:18 【问题描述】:

在“The Adventures of Generating Random Numbers in Erlang and Elixir”上的 Hashrockets 博客文章中,Dorian Karter 提到打开和关闭 erl 会话允许他从 PRNG random:uniform(). 复制相同的输出。

事实证明,对于每个 VM 实例,random 默认使用相同的种子。

例如:

第一节

1> random:uniform().
0.4435846174457203

第二场

1> random:uniform().
0.4435846174457203

如果调用种子方法将适用于整个 VM,或者仅适用于调用种子方法的进程,我似乎无法在文档中找到,或者我在网络上的搜索。

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

【问题讨论】:

【参考方案1】:

rand 模块取代了random 模块:

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

但是使用rand 模块:

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

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

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

【讨论】:

【参考方案2】:

来自https://erlang.org/doc/man/random.html的文档:

进程字典中的种子随机数生成...并返回旧状态。

(强调我的)

所以,是的,random 模块需要单独为每个进程播种。

【讨论】:

以上是关于Elixir/Erlang Random/Rand Seed 是不是需要在每个进程上调用?的主要内容,如果未能解决你的问题,请参考以下文章

Elixir/Erlang

E1.获取Elixir/Erlang版本信息

Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?

Elixir/Erlang:变量列表与许多其他列表合并时出错

将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序

在 Elixir/Erlang 中的(本地)Mnesia 实例上实现最佳写入性能