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
我正在尝试实现一个行为类似于骰子的代理:
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