# File lib/compat/securerandom.rb, line 158
    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
        # assumption: Float::MANT_DIG <= 64
        i64 = SecureRandom.random_bytes(8).unpack("Q")[0]
        Math.ldexp(i64 >> (64-Float::MANT_DIG), -Float::MANT_DIG)
      end
    end