Su problema es que el contenido de su variable ARR se está sobrescribiendo con cada iteración: el arr[k]
sobrescribe lo que ya esté allí. La variable ARR debe ser local en el bloque: en su lugar:
mat = []
2.times do # avoid for... use iterators instead
row = []
2.times do
row << rand.to_s
end
mat << row
end