Elixir - Agent中的随机数字

时间:2015-05-25 12:42:59

标签: random elixir agent

我试图实现一个像骰子一样的代理:

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相关的东西。

1 个答案:

答案 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