2016-06-22 50 views
1

我正在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)])). 

我知道这是一个有点草率和不完整的,但事实并非如此。

回答

1

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

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

如果一个进程调用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. timer:send_after(random:uniform(1000),producer,{last_element,self()}),,你送{last_element,self()}producer过程,但producer,你刚刚收到{last_element},这些消息不匹配。

你可以改变

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} ->一样的道理。