限制函数迭代次数

时间:2016-06-22 18:34:48

标签: erlang

我正在Erlang中编写一个代码,它假设在随机时间内生成一个随机数,并将每个数字添加到列表中。我管理了一个可以生成随机数的函数,并且我管理了一个将它添加到列表的方法,但我的主要问题是限制函数的迭代次数。我喜欢生成多个数字的函数并将它们添加到列表中,然后杀死该过程或类似的东西 到目前为止,这是我的代码:

generator(L1)->
random:seed(now()),
A = random:uniform(100),
L2 = lists:append(L1,A),
generator(L2),

producer(B,L) ->

receive
  {last_element} ->
   consumer ! {lists:droplast(B)}
end

consumer()->
 timer:send_after(random:uniform(1000),producer,{last_element,self()}),
receive
  {Answer, Producer_PID} ->
  io:format("the last item is:~w~n",[Answer])
end,
consumer().



start() ->

register(consumer,spawn(lis,consumer,[])),
register(producer,spawn(lis,producer,[])),
register(generator,spawn(lis,generator,[random:uniform(10)])).

我知道它有点草率和不完整但事实并非如此。

2 个答案:

答案 0 :(得分:1)

首先,您应该使用rand生成随机数而不是random,这是一个改进的模块。

此外,使用rand:uniform/1时,您每次运行程序时都不需要更改种子。来自erlang文档:

  

如果流程在未设置种子的情况下调用uniform/0uniform/1   首先,使用默认算法自动调用seed/1   创造一个非恒定的种子。

最后,为了创建随机数列表,请查看How to create a list of 1000 random number in erlang

如果我总结所有这些,你可以这样做:

[rand:uniform(100) || _ <- lists:seq(1, 1000)].

答案 1 :(得分:1)

您的代码中存在一些问题:

  1. timer:send_after(random:uniform(1000),producer,{last_element,self()}),,您将{last_element,self()}发送到producer进程,但在producer,您刚收到{last_element},这些邮件不匹配。
  2. 你可以改变

    producer(B,L) ->
        receive
            {last_element} ->
                consumer ! {lists:droplast(B)}
        end.
    

    producer(B,L) ->
        receive
             {last_element, FromPid} ->
                 FromPid! {lists:droplast(B)}
        end.
    

    consumer ! {lists:droplast(B)}{Answer, Producer_PID} ->相同的原因。