您的位置:首页 > 其它

Erlang--随机数

2016-04-25 10:26 239 查看
[color=blue]1、普通随机[/color]
random:uniform(N)


[color=blue]2、以时间为种子[/color](这是比较常见的一种做法)但是会出现一个问题:如果两个函数同一时刻去调用;或者一个函数循环递归调用,产生的随机数就不可靠了。
random:seed(erlang:now())
random:uniform(N)


[color=blue]3、通过crypto:strong_rand_bytes(N)生成种子[/color]。N是字节数,1Bytes=8Bit,
下面例子中,12个字节,那么12*8=96,二进制解析时,就分成3等份,每份32,当然,
你也可以随意分 :shock:

<<A:32,B:32,C:32>> = crypto:strong_rand_bytes(12)
random:seed(A,B,C)或random:seed({A,B,C})
random:uniform(N)


[color=blue]4、创建一个随机种子进程,为每个访问的调用进程提供不同的种子[/color](如果不采用上面第三种方法,就可以采用这个)。如果有特殊要求:比如A,B进程同时取随机数,由于随机种子更新的算法是一样,所以会有可能A,B随机出来的数值基本相同。
Seed = {random:uniform(9999),random:uniform(9999),random:uniform(9999))
将Seed保存到进程字典或者ets(建议用ets,因为可以直接跨进程取数据,其它进程不用通过call或者异步方式来获取Seed)
random:seed(Seed)
random:uniform(N)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: