Ruby:使用`.each`或`.step`,为每次迭代前移随机量

时间:2018-08-21 22:48:26

标签: ruby random iterator

(也开放给其他类似的非Rails方法)

给出(0..99),返回按顺序随机选择的条目。

示例结果:

0, 5, 11, 13, 34..

3, 12, 45, 67, 87

0, 1, 2, 3, 4, 5..(当然不太可能)

当前思想:

(0..99).step(rand(0..99)).each do |subindex|
  array.push(subindex)
end

但是,这为所有步骤设置了一个随机值,而我正在寻找每个步骤都是随机的。

3 个答案:

答案 0 :(得分:4)

获取要选择的元素数量的随机值,随机获取该元素数量,进行排序。

(0..99).to_a.sample((0..99).to_a.sample).sort
#⇒ [7, 20, 22, 29, 45, 48, 57, 61, 62, 76, 80, 82]

或者更短(记入@Stefan):

(0..99).to_a.sample(rand(0..99)).sort
#⇒ [7, 20, 22, 29, 45, 48, 57, 61, 62, 76, 80, 82]

或者,以更实用的方式:

λ = (0..99).to_a.method(:sample)
λ.(λ.()).sort

要准确输入N个数字:

N = 10
(0..99).to_a.sample(N).sort
#⇒ [1, 5, 8, 12, 45, 54, 60, 65, 71, 91]

答案 1 :(得分:2)

有很多方法可以实现它。

例如,这是一个缓慢而又简单的例子:

# given `array`
random_indexes = (0...array.size).to_a.sample(rand(array.size))
random_indexes.sort.each { |i| puts array[i] }

或者您为什么不这样做:

array.each do |value|
  next if rand(2).zero?
  puts value
end

或者您可以随机使用Enumerator#next次。

答案 2 :(得分:2)

下面的示例根据从数组true中随机选取的false[true, false]返回带有给定范围随机条目的排序数组:

(0..99).select { [true, false].sample }
 => [0, 3, 12, 13, 14, 17, 20, 24, 26, 28, 30, 32, 34, 35, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 65, 67, 69, 70, 71, 79, 81, 84, 86, 91, 93, 94, 95, 98, 99]

要减少返回更大数组的机会,可以修改true/false数组以包含更多假值:

(0..99).select { ([true] + [false] * 9).sample }
 => [21, 22, 28, 33, 37, 58, 59, 63, 77, 85, 86]