Il tuo problema è che il contenuto della tua variabile ARR è sovrascritto da ogni iterazione: il arr[k]
sovrascrive tutto ciò che c'è già lì dentro. La variabile ARR deve invece essere locale al blocco:
mat = []
2.times do # avoid for... use iterators instead
row = []
2.times do
row << rand.to_s
end
mat << row
end