Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 药剂中的随机数_Random_Elixir_Agent - Fatal编程技术网

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()可能会带来一些问题。