Random 药剂中的随机数
我正在尝试实现一个行为类似骰子的代理:Random 药剂中的随机数,random,elixir,agent,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 -
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
调用在代理内部?或者与流相关的内容
可能。调用种子生成器
函数的过程与代理将使用的过程不同。事实上,这个过程甚至在加载代码时都不存在。启动代理时尝试设定生成器种子:
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
似乎有效,是否执行了以下操作:Agent.start\u link(fn->:random.seed(:erlang.now);[]结束,名称:\uuu模块u)
以保留空列表作为默认状态。谢谢。您在roll
函数中忽略了状态,所以我认为这无关紧要。您的实际状态是保存随机生成器状态的进程字典。与erlang.now()不同,os.timestamp()函数可能也很好:因为erlang.now()可能会带来一些问题。