How to generate random positive real number in Julia?

Viewed 86

I wanna fill my array in Julia by positive real numbers. But I found information only how to do it with integers or real numbers (including negatives). Is it possible? Thanks!

2 Answers

You can use any mathematical formula that maps the [0, 1) range into the [0, +inf]:

For example, if x is your random variable in the [0, 1) range (obtained with e.g. rand() for float data types):

  • tan(x * pi / 2)
  • atanh(x)
  • log(x) ^ 2
  • -log(x) / x ^ p (for p non-negative integer -- it will change the number distribution)

There are many other functions.

Of course the numbers are no longer uniformly distributed, but that is impossible to achieve.

Technically, the built-in randexp fulfils your requirement: the exponential distribution has the positive reals as its support. The scale of the numbers you practically get is much lower, though. The same holds for abs ∘ randn, the half-normal distribution. (In both cases, you could multiply the results with a large positive number to increase the variance to your requirements.)

Here's a funny alternative: you can generate uniformly random bits, and reinterpret them as floats (and just set the sign always to positive):

julia> bitrand(3*64).chunks
3-element Vector{UInt64}:
 0xe7c7c52703987e68
 0xc221b9864e7bab7e
 0xa45b39faa65b446e

julia> reinterpret(Float64, bitrand(3*64).chunks)
3-element reinterpret(Float64, ::Vector{UInt64}):
  2.8135484124856866e-108
 -4.521596431965459e53
 -5.836451011310255e78

julia> abs.(reinterpret(Float64, bitrand(3*64).chunks))
3-element Vector{Float64}:
 1.6467305137006711e236
 3.3503597018864875e-260
 1.2211675821672628e77

julia> bitstring.(abs.(reinterpret(Float64, bitrand(3*64).chunks)))
3-element Vector{String}:
 "0000110000011000001110000110001111010000011110111101000101101101"
 "0011000010110101111100111011110100111100011011000101001100010011"
 "0110111000001000101011010100011011010010100111111011001000001100"

This is still not a uniform distribution on the values, though, as the precision of floats gets smaller the larger the exponent gets.

Related