Erlang--随机数
程序员文章站
2022-07-15 08:25:36
...
1、普通随机
2、以时间为种子(这是比较常见的一种做法)但是会出现一个问题:如果两个函数同一时刻去调用;或者一个函数循环递归调用,产生的随机数就不可靠了。
3、通过crypto:strong_rand_bytes(N)生成种子。N是字节数,1Bytes=8Bit,
下面例子中,12个字节,那么12*8=96,二进制解析时,就分成3等份,每份32,当然,
你也可以随意分
4、创建一个随机种子进程,为每个访问的调用进程提供不同的种子(如果不采用上面第三种方法,就可以采用这个)。如果有特殊要求:比如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)
random:uniform(N)
2、以时间为种子(这是比较常见的一种做法)但是会出现一个问题:如果两个函数同一时刻去调用;或者一个函数循环递归调用,产生的随机数就不可靠了。
random:seed(erlang:now()) random:uniform(N)
3、通过crypto:strong_rand_bytes(N)生成种子。N是字节数,1Bytes=8Bit,
下面例子中,12个字节,那么12*8=96,二进制解析时,就分成3等份,每份32,当然,
你也可以随意分
<<A:32,B:32,C:32>> = crypto:strong_rand_bytes(12) random:seed(A,B,C)或random:seed({A,B,C}) random:uniform(N)
4、创建一个随机种子进程,为每个访问的调用进程提供不同的种子(如果不采用上面第三种方法,就可以采用这个)。如果有特殊要求:比如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)