Elixir - 代理中的随机数

Elixir - Randomized numbers in 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 调用在 Agent 内部而无法正常工作?或者与 Stream 相关的东西。

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