我从rand(1..117)
开始。让我们说它打印80.我想生成另一个比第一个数字少20和20之间的随机数,但仍然在1到117之间,即防止负数或高于117的数字。
我可以得到例如50,35,55,45,64,79,99,88,108等。每个数字介于1和117之间,但不低于或高于它之前的数字。< / p>
答案 0 :(得分:8)
将随机值-20和最小值(1)放在一个数组中并确定最大值。同样,值+ 20和117,但你想要最小值。
这听起来比以前更复杂:
puts r = rand(1..117)
99.times do
puts r = rand([r-20, 1].max..[r+20, 117].min)
end
答案 1 :(得分:2)
这是一个解决方案:
def randwalk(min, max, step)
return enum_for(__callee__, min, max, step) unless block_given?
yield n = rand(min..max)
loop do
# min=1 // n=3 // step=20 => subtract up to 2
# min=1 // n=50 // step=20 => subtract up to 20
from = [min - n, -step].max
# max=100 // n=97 // step=30 => add up to 3
# max=100 // n=50 // step=30 => add up to 30
to = [max - n, step].min
yield n += rand(from..to)
end
end
randwalk(1, 117, 20).first(10) # => [90, 89, 103, 87, 106, 94, 96, 99, 97, 103]
randwalk
返回一个Ruby enumerator,它会根据您选择的定义随机游走产生尽可能多的值。如果你愿意的话,它会永远地继续下去,并且它会赢得&#34;步骤&#34;在给定的最小值/最大值之外如果您对实施或如何使用它有任何疑问,请与我们联系。
答案 2 :(得分:2)
您可以使用clamp
确保数字在给定范围内:
105.clamp(1, 117) #=> 105
120.clamp(1, 117) #=> 117
-15.clamp(1, 117) #=> 1
要生成一个随机序列,其中每个数字在前一个数字的±20之内(并且仍在1..117之内),我会使用Enumerator
:
random_sequence = Enumerator.new do |y|
min = 1
max = 117
num = rand(min..max)
loop do
y << num
num = rand((num - 20).clamp(min, max)..(num + 20).clamp(min, max))
end
end
random_sequence.take(10)
#=> [12, 31, 50, 47, 57, 73, 66, 46, 60, 46]