module RSpec::Core::Backports::Random::Implementation

def ==(other)

def ==(other)
  other.is_a?(Random) &&
    seed == other.seed &&
    left == other.send(:left) &&
    state == other.send(:state)
end

def _rand_range(limit)

def _rand_range(limit)
  range = limit.end - limit.begin
  if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
    range += 1 unless limit.exclude_end?
    limit.begin + @mt.random_integer(range) unless range <= 0
  elsif range = Backports.coerce_to(range, Float, :to_f)
    if range < 0
      nil
    elsif limit.exclude_end?
      limit.begin + @mt.random_float * range unless range <= 0
    else
      # cheat a bit... this will reduce the nb of random bits
      loop do
        r = @mt.random_float * range * 1.0001
        break limit.begin + r unless r > range
      end
    end
  end
end

def bytes(nb)

def bytes(nb)
  nb = Backports.coerce_to_int(nb)
  raise ArgumentError, "negative size" if nb < 0
  @mt.random_bytes(nb)
end

def initialize(seed = 0)

def initialize(seed = 0)
  super()
  seed_rand seed
end

def left

def left
  @mt.left
end

def marshal_dump

def marshal_dump
  @mt.marshal_dump << @seed
end

def marshal_load(ary)

def marshal_load(ary)
  @seed = ary.pop
  @mt = MT19937.allocate
  @mt.marshal_load(ary)
end

def rand(limit = Backports::Undefined)

def rand(limit = Backports::Undefined)
  case limit
    when Backports::Undefined
      @mt.random_float
    when Float
      limit * @mt.random_float unless limit <= 0
    when Range
      _rand_range(limit)
    else
      limit = Backports.coerce_to_int(limit)
      @mt.random_integer(limit) unless limit <= 0
  end || raise(ArgumentError, "invalid argument #{limit}")
end

def seed_rand(new_seed = 0)

def seed_rand(new_seed = 0)
  new_seed = Backports.coerce_to_int(new_seed)
  @seed = nil unless defined?(@seed)
  old, @seed = @seed, new_seed.nonzero? || Random.new_seed
  @mt = MT19937[ @seed ]
  old
end

def state

def state
  @mt.state_as_bignum
end