我试图实现一个像骰子一样的代理:
defmodule Dice do
@on_load :seed_generator
def start_link(opts \\ []) do
Agent.start_link(fn -> [] end, name: __MODULE__)
end
def roll(n, val) do
Agent.cast(__MODULE__, fn(_) ->
Stream.repeatedly(fn -> :random.uniform(val) end)
|> Enum.take(n)
end)
end
def seed_generator do
:random.seed(:erlang.now)
:ok
end
end
然而,每次重新启动iex时生成的数字都是相同的。
我究竟做错了什么 ?种子无效,因为:random.uniform
调用是在代理内部吗?或者与Stream
相关的东西。
答案 0 :(得分:8)
seed_generator
函数的调用流程与您Agent
将使用的流程不同。实际上,在加载此代码时,该进程甚至不存在。尝试在启动Agent
时播种生成器:
defmodule Dice do
def start_link(opts \\ []) do
Agent.start_link(fn -> :random.seed(:erlang.now) end, name: __MODULE__)
end
def roll(n, val) do
Agent.get(__MODULE__, fn(_) ->
Stream.repeatedly(fn -> :random.uniform(val) end)
|> Enum.take(n)
end)
end
end