[erlang-questions] On OTP rand module difference between OTP 19 and OTP 20
Richard A. O'Keefe
ok@REDACTED
Mon Sep 4 02:37:50 CEST 2017
On 1/09/17 8:49 PM, Raimo Niskanen wrote:
>> By the way, given that a common way to make random floats is to
>> generate a bitvector, consider
>> (0 to: 15) collect: [:each | ((each / 15) * 256) truncated].
>> You will notice that the spacing between the values is *almost*
>> uniform, but not at the end.
>
> That sounds interesting but I do not understand. Is that Elixir code?
Nope, Smalltalk. I wanted to use rational arithmetic. In fact I did
not need to. Here it is in Haskell:
> [(x * 256) `div` 15 | x <- [0..15]]
[0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,256]
Let's push that a bit further. Let's generate all possible 10-bit
integers and map them to the range [0..63]. We find again that
the gap sizes are not all the same. They can't be. If you
consider all vectors of N bits and map them to the range
[0..2**M] they *cannot* be uniformly distributed no matter what
method you use because (2**M+1) does not divide 2**N. You can
fix this by rejecting some of the bit vectors, but that would
be asking everyone to pay extra for a result they don't have any
particular need for.
More information about the erlang-questions
mailing list