erlang随机数

uniform() ->

      {A1, A2, A3} = case get(random_seed) of

                                     undefined ->

                                                seed0();

                                     Tuple ->

                                               Tuple

                                 end,

        B1 = (A1*171) rem 30269,

        B2 = (A2*172) rem 30307,

        B3 = (A3*170) rem 30323,

        put(random_seed, {B1,B2,B3}),

        R = A1/30269 + A2/30307 + A3/30323,

        R - trunc(R).

每次调用会更新进程字典里的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()之。

 

%% 产生一个介于Min到Max之间的随机整数
rand(Same, Same) -> Same;
rand(Min, Max) ->
    %% 如果没有种子,将从核心服务器中去获取一个种子,以保证不同进程都可取得不同的种子
    case get("rand_seed") of
        undefined ->
            RandSeed = yp_rand:get_seed(),
            random:seed(RandSeed),
            put("rand_seed", RandSeed);
        _ -> skip
    end,
    %% random:seed(erlang:now()),
    M = Min - 1,
    random:uniform(Max - M) + M.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值