我正在尝试快速生成足够随机的数字。
现在我正在使用以下内容:
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
感谢您的帮助。
答案 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}
。