Erlang - 随机数gen与Makeref

时间:2011-02-10 20:32:07

标签: random erlang integer

我正在尝试快速生成足够随机的数字。

现在我正在使用以下内容:

uniqueID() ->   C = random:uniform(9999) ,   %%%DO SPEED TEST
    random:seed(C,random:uniform(99),random:uniform(99)),
    {_, {H, Min, S}}  = calendar:universal_time(),
    {A, B} = statistics(wall_clock),
    (A*B) +((H + C + Min) * S).

与make_ref()相比需要太长时间。

6> make_ref().
#Ref<0.0.0.74>

如何获取唯一引用并将其解析为整数?

如00074

感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

您确定要将erlang:make_ref/0用于唯一数字吗? Refs仅对于一个erlang vm的一次启动是唯一的 - 它们是可重复的,可预测的,并且如果您打算将它们用于除了erlang消息中的标签之外的其他任何内容以匹配请求和回复,则会产生糟糕的唯一标识符。

您可以将ref格式化为字符串(erlang:ref_to_list/1),然后解析它。

但是,我认为最好的想法是使用crypto:rand_bytes/1为自己提供随机字节的N字节二进制,或crypto:rand_uniform/2如果需要某个范围内的随机整数。这种方法至少可以为您生成的随机整数的质量提供一些保证(参见openssl rand_bytes documentation)。

答案 1 :(得分:1)

{A,B,C} = now(),A * 1000000000000 + B * 1000000 + C.

答案 2 :(得分:0)

从Erlang / OTP版本18.0开始,使用erlang:unique_integer/{0,1}开箱即用。

在没有选项的情况下调用它会返回唯一值,并且使用修饰符可以产生严格单调的结果,尽管这些调用更加昂贵。

  

erlang:unique_integer() - &gt;整数()
   erlang:unique_integer(ModList) - &gt;整数()Modlist = [Modifier]
  修饰符=正|单调

     

生成并返回integer unique on current runtime system instance。整数在这个BIF的意义上是唯一的,使用   同一组修饰符,不会返回相同的整数   一次在当前运行时系统实例上。每个整数值都可以   当然可以通过其他方式构建。

     

目前有效的修饰符:

     


  只返回正整数。

     

单调
  严格单调回报   增加与创建时间相对应的整数。

erlang:now/0被弃用,a few things are suggested to be implemented erlang:unique_integer/{0,1}