从第一个数字生成一个随机数和另一个具有特定边距的随机数

时间:2018-05-17 20:17:24

标签: ruby random

我从rand(1..117)开始。让我们说它打印80.我想生成另一个比第一个数字少20和20之间的随机数,但仍然在1到117之间,即防止负数或高于117的数字。

我可以得到例如50,35,55,45,64,79,99,88,108等。每个数字介于1和117之间,但不低于或高于它之前的数字。< / p>

3 个答案:

答案 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]