def self.random_number(n=0)
if 0 < n
hex = n.to_s(16)
hex = '0' + hex if (hex.length & 1) == 1
bin = [hex].pack("H*")
first = bin[0..0]
mask = first.respond_to?(:ord) ? first.ord : first.sum(8)
mask |= mask >> 1
mask |= mask >> 2
mask |= mask >> 4
begin
rnd = SecureRandom.random_bytes(bin.length)
first = rnd[0..0]
ordinal = first.respond_to?(:ord) ? first.ord : first.sum(8)
rnd[0..0] = (ordinal & mask).chr
end until rnd < bin
rnd.unpack("H*")[0].hex
else
i64 = SecureRandom.random_bytes(8).unpack("Q")[0]
Math.ldexp(i64 >> (64-Float::MANT_DIG), -Float::MANT_DIG)
end
end