【问题标题】:Make a process sleep for a random time - Erlang让进程随机休眠 - Erlang
【发布时间】:2014-05-12 20:32:06
【问题描述】:

我想使用计时器类的睡眠功能,我想用它让进程在 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}]}]}

这有什么问题?

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我认为您需要为 sleep 函数提供正确的参数。根据documentation,它需要以毫秒为单位的时间。你给它种子()的结果,它返回随机数生成器的旧状态。我建议这样做:

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

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

      【讨论】:

      • 对不起,我错了,我用的是制服。我只是打错了。我在 shell 中尝试了你的函数并得到了 ** 异常错误:函数 timer:sleep/1 (timer.erl, line 152) 中的错误接收超时值谢谢
      • @Harley,嗨,我打错字了:它是 timer.seconds,应该是 timer:seconds。
      【解决方案3】:
      {A1,A2,A3} = now(),
      random:seed(A1, A2, A3), 
      

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

      然后你用uniform() -&gt; float() 得到一个介于0.01.0 之间的随机数, 使用seconds(Seconds) -&gt; MilliSeconds 以秒为单位获取毫秒数。 调用sleep(Time) -&gt; ok 将调用此函数的进程挂起,时间为毫秒。

      【讨论】:

      • 嗨,我不确定你对第二部分答案的意思。谢谢。
      • 其实,没有。我的错,我只是愚蠢!非常感谢。
      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多