2016-06-22 9 views
1

Ich schreibe einen Code in Erlang, der eine Zufallszahl für eine zufällige Zeit generiert und jede Zahl zu einer Liste hinzufügt. Ich habe eine Funktion verwaltet, die Zufallszahlen generieren kann, und ich habe irgendwie eine Methode zum Hinzufügen zu einer Liste verwaltet, aber mein Hauptproblem ist die Beschränkung der Anzahl der Iterationen der Funktion. Ich mag die Funktion, um mehrere Zahlen zu produzieren und sie der Liste hinzuzufügen und dann diesen Prozess oder etwas ähnliches zu töten.
Hier ist mein Code so weit:Einschränken der Anzahl der Funktionsiterationen

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)])). 

Ich weiß, es ist ein wenig schlampig und unvollständig, aber das ist nicht der Fall.

Antwort

1

Zuerst sollten Sie rand verwenden, um Zufallszahlen statt random zu generieren, es ist ein verbessertes Modul.

Darüber hinaus müssen Sie bei Verwendung von rand:uniform/1 den Seed nicht jedes Mal ändern, wenn Sie Ihr Programm ausführen. Von erlang Dokumentation:

Wenn ein Prozess ruft uniform/0 oder uniform/1 ohne einen Samen erste Einstellung wird seed/1 automatisch mit dem Standard-Algorithmus genannt und erzeugt einen nicht konstanten Samen.

Schließlich, um eine Liste von Zufallszahlen zu erstellen, werfen Sie einen Blick auf How to create a list of 1000 random number in erlang.

Wenn ich das alles abschließen, können Sie einfach tun:

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

Es in Ihrem Code eine Frage haben:

  1. timer:send_after(random:uniform(1000),producer,{last_element,self()}),, senden Sie {last_element,self()}-producer Prozess, aber in producer, Sie erhalten Sie einfach {last_element}, diese Nachrichten werden nicht zugeordnet.

können Sie

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

zu

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

aus dem gleichen Grund für consumer ! {lists:droplast(B)} und {Answer, Producer_PID} -> ändern.