我正在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)])).
我知道它有点草率和不完整但事实并非如此。
答案 0 :(得分:1)
首先,您应该使用rand
生成随机数而不是random
,这是一个改进的模块。
此外,使用rand:uniform/1
时,您每次运行程序时都不需要更改种子。来自erlang文档:
如果流程在未设置种子的情况下调用
uniform/0
或uniform/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} ->
相同的原因。