首页 > 代码库 > erlang的随机数 及 random:uniform()函数

erlang的随机数 及 random:uniform()函数

  erlang的随机数是一个常用的东西,random:uniform()函数,如果在一次调用中,它会生成不同的随机数,但如果是多个不同的进程调用,则它的结果随机数是一致的(多个进程相同位置比较)。

每次调用会更新进程字典里的random_seed变量,这样在同一个进程内每次调用random:uniform()时,随机数种子都不同,所以生成的随机数都不一样(调用完random:uniform()后,可以用get(random_seed)查看更新后的种子值)。

但是如果是不同的进程分别调用random:uniform(),因为随机种子更新的算法是一样的,所以每次各进程的随机数种子也是相同的,从而生成的随机数也是一样的,要想让不同进程生成的随机数不同,要手动为每个进程设置不同的种子,常用的是用erlang:now,比如:

random:seed(erlang:now()),random:uniform().

不过如果每个进程调用random:seed(erlang:now())太接近,种子值会比较接近,生成的随机数也会比较接近更好的方法是用一个单独的进程来生成种子,保证每次的种子值相差比较大

Seed = {random:uniform(99999), random:uniform(999999), random:uniform(999999)}

然后每次调用random:uniform()前从该种子生成进程获取最新的种子值,seed()之。

erlang的随机数 及 random:uniform()函数