builtins/random_source/generator.rb

tests/_examples/builtins/random_source/generator.rb in the metorex repository.

# A seeded generator answers the same numbers Ruby's own does, since both
# draw from the Mersenne Twister.
p Random.new(33).bytes 2
p Random.new(2 ** (63 * 4)).bytes 2
p Random.new(1234).rand
p Random.new(42).rand(0.0...100.0)
p Random.new(42) == Random.new(42)
p Random.new(42).seed
p Random.urandom(8).bytesize
p Random.new_seed.is_a? Integer

# A Range draws from the width between its ends, so an end that subtracts and
# adds bounds a draw of its own kind.
Kernel.srand 176542
p Kernel.rand(3..5).between?(3, 5)

Counter = Struct.new :value do
  def to_int
    value
  end

  def <=> other
    to_int <=> other.to_int
  end

  def - other
    self.class.new to_int - other.to_int
  end

  def + other
    self.class.new to_int + other.to_int
  end
end
p rand(Counter.new(1)..Counter.new(42)).is_a? Counter
begin
  rand Object.new..67
rescue ArgumentError => problem
  p problem.message
end

Output:

"\x14\\"
"_\x91"
0.1915194503788923
37.454011884736246
true
42
8
true
true
true
"bad value for range"