Just a thought... which of these is "better"?

Raimo Niskanen raimo+erlang-questions@REDACTED
Tue Oct 26 09:16:24 CEST 2021

The 'rand' module is better.  The 'random' module implements
an old, statistically flawed Pseudo-Random Number Generator
and should not be used any more.
Joking aside; I guess you are saying that the verbose exception from
`rand:uniform/1` does not give any better understanding of the error,
which is that the argument `0` is out of range since it has to be
an `integer() >= 1`.

I agree that you have a point.  But introducing guards at every
API function that is a wrapper for another API function would just
be introducing redundant guards that may get out of sync with
each other in a future code update.

The actual problem here I'd say is that the exception from
`rand:uniform_s/2` is what you show here.

I think a good solution would be to implement
exception formatting for the `rand` module.  Such an
implementation could easily add a line:

    *** argument 1: not of type integer() >= 1

to that exception printout.

On Mon, Oct 25, 2021 at 06:01:25PM -0500, Steve Davis wrote:
> > rand:uniform(0).
> ** exception error: no function clause matching 
>                     rand:uniform_s(0,
>                                    {#{bits => 58,
>                                       jump => #Fun<rand.3.47293030>,
>                                       next => #Fun<rand.0.47293030>,
>                                       type => exsss,
>                                       uniform => #Fun<rand.1.47293030>,
>                                       uniform_n => #Fun<rand.2.47293030>},
>                                     [287343104968817679|100345946487370353]}) (rand.erl, line 326)
>      in function  rand:uniform/1 (rand.erl, line 299)
> > random:uniform(0).
> ** exception error: no function clause matching random:uniform(0) (random.erl, line 119)


/ Raimo Niskanen, Erlang/OTP, Ericsson AB

More information about the erlang-questions mailing list