让一个进程随机休眠 - Erlang

时间:2014-04-01 20:46:50

标签: erlang

我想使用timer类的sleep函数,我想用它来使进程在0到1之间的随机时间内休眠。

为了做到这一点,我尝试了:

timer:sleep(random:uniform()).

但是,我收到以下错误消息:

=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}]}]}

这有什么问题?

另外,由于我有相同流程的多个版本,如何确保每个版本以不同的随机数开头?

3 个答案:

答案 0 :(得分:4)

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

您可以在每个进程启动函数中运行此代码。由于randon种子存储在进程字典中,因此每个进程都有不同的进程字典。你最好为每个过程设置随机种子。

然后你使用uniform() -> float()来获取0.01.0之间的随机数, 使用seconds(Seconds) -> MilliSeconds获取以秒为单位的毫秒数。 调用sleep(Time) -> ok暂停调用此函数的进程的Time of milliseconds。

答案 1 :(得分:1)

我认为你需要为睡眠功能提供正确的参数。根据{{​​3}},它需要的时间以毫秒为单位。你给它的结果是seed(),它返回随机数生成器的旧状态。我建议这样做:

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

uniform()返回0到1之间的数字,秒()将秒数转换为毫秒

答案 2 :(得分:1)

即使使用timer:seconds,我也会收到"timeout_value"错误消息。

这是因为timer:sleep()需要一个毫秒的整数值而不是一个浮点数。 只需添加round()就可以了:

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