2014-04-01 15 views
5

Vorrei utilizzare la funzione sleep della classe timer e vorrei utilizzarlo per far dormire un processo per un intervallo di tempo casuale compreso tra 0 e 1.Effettuare un processo inattivo per un tempo casuale - Erlang

per fare questo, ho provato:

timer:sleep(random:uniform()). 

Tuttavia, ricevo il seguente messaggio di errore:

=ERROR REPORT==== 1-Apr-2014::21:39:32 === 
Error in process <0.472.0> with exit value: {timeout_value,[{timer,sleep,1,  
[{file,"timer.erl"},{line,152}]},{myModule,myFunction,4,[{file,"myModule.erl"}, 
{line,46}]}]} 

Cosa c'è di sbagliato in questo?

Inoltre, poiché ho più versioni dello stesso processo, come posso assicurarmi che ciascuna inizi con un numero casuale differente?

risposta

4
{A1,A2,A3} = now(), 
random:seed(A1, A2, A3), 

È possibile eseguire questo codice in ogni avvio del processo funzione. Poiché il seme di randon è memorizzato nel dizionario di processo, ogni processo ha un dizionario di processi diverso. farebbe meglio ad impostare un seme casuale per ogni processo.

Poi caso d'uso uniform() -> float() per ottenere un numero casuale compreso tra 0.0 e 1.0, uso seconds(Seconds) -> MilliSeconds per ottenere il numero di millisecondi in pochi secondi. chiamare sleep(Time) -> ok per sospendere il processo chiamando questa funzione per la quantità di tempo di millisecondi.

+0

Ciao, non sono sicuro di cosa intendi per la seconda parte della risposta. Grazie. – Haych

+0

Quale parte ????? – BlackMamba

+0

In realtà, no. Il mio errore, ero solo stupido! Grazie mille. – Haych

1

Penso che sia necessario fornire l'argomento giusto per la funzione sleep. Secondo lo documentation ha bisogno del tempo in millisecondi. Si sta dando il risultato di seed() che restituisce il vecchio stato del generatore di numeri casuali. Suggerisco di fare questo:

random:seed(). 
timer:sleep(timer:seconds(random:uniform())). 

uniforme() restituisce numero compreso tra 0 e 1 e secondi() converte secondi ai millisecondi

+0

Siamo spiacenti, il mio errore, stavo usando uniforme. Ho appena digitato. Ho provato la funzione nel guscio e mi ** errore di eccezione: bad ricevere il valore di timeout in Funzione Timer: sonno/1 (timer.erl, linea 152) Grazie – Haych

+1

@Harley, ciao ho avuto un errore di battitura lì: era timer.secondi, dovrebbe essere il timer: secondi. –

0

Anche quando si utilizza timer:seconds Viene visualizzato il messaggio di errore "timeout_value".

Succede perché timer:sleep() prevede un valore intero di millisecondi anziché un valore float. Basta aggiungere round() e funziona:

timer:sleep(round(timer:seconds(random:uniform())))