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