7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# File 'lib/propr/random/integer.rb', line 7
def random(options = {}, m = Propr::Random)
min = (options[:min] || Integer::MIN).to_i
max = (options[:max] || Integer::MAX).to_i
raise ArgumentError,
"min > max" if min > max
range = max - min
center = options.fetch(:center, :mid)
center =
case center
when :mid then min + (max - min).div(2)
when :min then min
when :max then max
when Numeric
raise ArgumentError,
"center < min" if center < min
raise ArgumentError,
"center > max" if center > max
center
else raise ArgumentError,
"center must be :min, :mid, :max, or min <= Integer <= max"
end
m.bind(m.rand(range + 1)) do |rnd|
m.bind(m.scale(rnd + min, range, BigDecimal(center))) do |n|
m.unit(n > center ? n.floor : n.ceil)
end
end
end
|