[erlang-bugs] Unstated limits of random:uniform/1

Kostis Sagonas <>
Tue Feb 11 15:47:25 CET 2014


The documentation of random:uniform/1 reads:

   uniform(N) -> integer() >= 1

   Types:

     N = integer() >= 1

   Given an integer N >= 1, uniform/1 returns a random integer uniformly 
distributed between 1 and N, updating the state in the process dictionary.

and from it a (naive?) Erlang programmer would assume that it works for 
Erlang integers. However, apparently there is an (unstated) upper limit.

========================================================================
Eshell V6.0  (abort with ^G)
1> random:uniform(1 bsl 42).
1950905779137
2> random:uniform(1 bsl 1023).
64990220693815292632299777453770053245701880982584490305757715776780176648584151835529728245903303858071465265235635364507930685677056366431569479144084789774752709050314473717035731429737215919311815680621634352115003928201262448305879457258028874562676857884269587024825648343920396535221283000212783104001
3> random:uniform(1 bsl 1024).
** exception error: an error occurred when evaluating an arithmetic 
expression
      in function  random:uniform/1
      in call from erl_eval:do_apply/6
      in call from shell:exprs/7
      in call from shell:eval_exprs/7
      in call from shell:eval_loop/3
      in call from prim_file:set_cwd/2
========================================================================

Minimally, the published documentation (and the types of all functions 
of this module) has to be updated to explicitly mention this limit.

Ideally, the implementation has to change to avoid use of floats when 
manipulating Erlang integers.  IMO, it does not really have to do this 
and result in crashes like that.

Kostis


More information about the erlang-bugs mailing list