Random Erlang-带Makeref的随机数生成器

Random Erlang-带Makeref的随机数生成器,random,erlang,integer,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

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

现在,我正在使用以下工具:

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并将其解析为整数

例如00074


谢谢您的帮助。

您真的确定要使用
erlang:make_ref/0
获取唯一的数字吗?REF只对一个erlang vm的一次启动是唯一的—如果您计划将它们用于erlang消息中的标记以外的任何内容来匹配请求和回复,它们是可重复的、可预测的,并且是糟糕的唯一标识符

您可以通过将ref格式化为字符串(
erlang:ref\u to\u list/1
)然后对其进行解析来实现


然而,我认为最好的办法是使用
crypto:rand_bytes/1
获得随机字节的
N
字节二进制,或者
crypto:rand_uniform/2
如果需要某个范围内的随机整数。此方法至少为您生成的随机整数的质量提供了一些保证(请参阅)。

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

从Erlang/OTP 18.0版开始,这是使用现成的方法支持的

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

erlang:unique_integer()->integer()
erlang:unique_integer(ModList)->integer()ModList=[Modifier]
修饰语=正|单调

生成并返回一个。整数是唯一的,因为此BIF使用 同一组修饰符返回的同一整数不会超过 在当前运行时系统实例上执行一次。每个整数值可以是 课程可以通过其他方式进行建设

当前有效的修饰符:

阳性
只返回正整数

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


随着
erlang:now/0
被弃用,使用
erlang:unique_integer/{0,1}

加密比我现在使用的原始版本快吗?我也不需要它在节点间是唯一的,它将用于消息传递,但是它确实需要是一个整数。我不知道-我想速度会慢一些,但您希望基准测试来确定。OTP手册中的“不要猜测什么时候你能知道”。我的下一个问题是速度到底有多重要?您的系统的性能真的是由生成消息标签决定的吗?如果每个进程只需要一个唯一的数字,为什么不在进程状态下保留一个整数计数器呢?如果@user417896真的需要足够好的整数来标记消息以匹配请求和响应,那么这是一个非常好的方法。现在它需要一个模拟器范围的锁,但在99%的情况下这是一个可忽略的成本。我尝试过使用它,但有时数字是在同样的几百纳秒内生成的。我的经验是,now()给出了相同的数字,我最终得到了相同的“随机”数字。这同样适用于使用random:uniform(),它根本不是唯一的,我相信它是基于时间本身。
now()
保证始终给出唯一的数字。看。如果使用的是
random:uniform()
,则必须使用初始化种子。
6> make_ref().
#Ref<0.0.0.74>