请告诉我红宝石和尚的代码

时间:2014-10-12 21:10:15

标签: ruby

def random_select(array, n)
  result = []
  n.times do
    # I do not fully understand how this line below works or why. Thank you 
    result.push array[rand(array.length)]
  end
  result
end

2 个答案:

答案 0 :(得分:1)

你可能对这部分感到困惑:

n.times do
    result.push(array[rand(array.length)])
  end

n.times说它应循环n次。

result.push基本上说"推"或" put"数组中的东西。例如:

a = []
a.push(1)
p a #=> [1]

array[rand(array.length)]中,rand(array.length)将生成一个随机数作为数组的索引。为什么? rand(n)生成一个从0到n-1的数字。例如,rand(5)将生成0,1,2,3或4。

数组使用基于0的索引,因此如果你有一个数组,比如说a = ['x', 'y', 'z'],就可以访问' x'您执行a[0],访问y a[1]等等。如果要访问a中的随机元素,则执行a[rand(array.length)],因为在这种情况下a.length为3,rand(3)将生成0,1或2的数字。 0是最小的索引,2是我们的示例数组的最大索引。

假设我们称这种方法为:

random_select([6,3,1,4], 2)

尝试从内到外看到这段代码。代码到达此部分时:

result.push(array[rand(array.length)])

它将首先执行array.length,它将生成4.然后它将执行rand(array.length)rand(4),它将得到0到3之间的数字。然后,它将执行{{1或array[rand(array.length)],它将从数组中获取一个随机元素。最后,array(some_random_number_between_0_and_3)将把数组中的随机元素放在result.push(all_of_that_code_inside_that_got_us_a_random_array_element)数组中的方法中(在我们的示例中,它将是6,3,1或4)。然后它将再次重复相同的过程(记住,我们告诉它在迭代中进行2次)。

答案 1 :(得分:0)

使用块形式的构造函数可以将代码重写为更简单:

def random_select(array, n)
  Array.new(n) {array.sample}
end

这将创建一个大小为n的新数组,并使用数组中的随机样本填充它。

请注意,上述解决方案与示例代码一样,每次都会从整个数组中进行选择,从而允许重复选择。如果您不想要任何重复选择,则更简单,因为它是Array#sample的默认行为:

def random_select(array, n)
  array.sample(n)
end