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 进程调用种子(random
或 rand
)函数?或者一个调用 ~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 中的命名函数是不是有等效于 __MODULE__ 的方法?
Elixir/Erlang:变量列表与许多其他列表合并时出错