2015-03-27 4 views
0

Я пытаюсь создать метод, который случайным образом заполняет массив массивов размером 10 x 10, первоначально заполненный 0, с 1.Вставка значений случайным образом в массив массивов

class World 

    attr_accessor :grid 

    def initialize w, h, p = 0 
    @width = w 
    @height = h 
    @grid = span(@height, span(@width)) 
    populate(p) 
    end 

    def span dim = 10, val = 0 
    out = [] 
    (1..dim).each do |x| 
     out.push(val) 
    end 
    return out 
    end 

    def populate population 
    population.times do 
     puts "#{rand(@height)} #{rand(@width)}" 
     @grid[rand(@height)][rand(@width)] = 1 
    end 
    end 

    def show 
    @grid.each do |row| 
     puts row.join("") 
    end 
    end 

end 

world = World.new(10, 10, 5) 
puts world.grid.to_s 

Я пробовал несколько различных подходов, и каждый раз, когда мой выход что-то вроде:

2 4 
9 3 
5 6 
0 8 
5 6 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 
0100101100 

@grid[rand(@height)][rand(@width)] Почему, кажется, имеют те же ключи, каждый итерации, несмотря на puts "#{rand(@height}} #{rand(@width)}" показывает изменение значения?

+0

Я думаю, что вы хотите что-то вроде '@grid = Array.new (10) {Array.new (10) {[rand (@height)] [rand (@width)]}}'. Это даст вам массив из 10 элементов, каждый из которых представляет собой массив из 10 элементов, каждый из которых представляет собой массив '[rand (@height), rand (@width)]'. –

+0

Я согласен, что это лучший подход, но мне очень хотелось бы знать, почему это не работает, для дальнейшего использования. – RobertAKARobin

+0

Конечно ... –

ответ

2

Причина, по которой не работает из-за вашей функции диапазона. Он отлично работает, когда вы хотите создать инициал:

span(@width)

Это даст вам ваш массив:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Но когда вы называете его во второй раз и пройдет в этом массиве push не делает 10 копий этого массива. Вместо этого он нажимает на ссылку на этот массив 10 раз. Так что это не имеет значения, если вы

@grid[3][5] или @grid[0][5]

Они оба в одном месте.

+0

D'oh! Конечно! Спасибо! – RobertAKARobin

0

Рассмотрите возможность использования стандартного Matrix class:

require 'matrix' 
m = Matrix.build(10) { rand(2) }.to_a 
# => [[0, 1, 0, 0, 1, 0, 0, 0, 1, 1], [0, 1, 0, 1, 1, 1, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1, 0, 0, 1, 0], [0, 1, 1, 0, 0, 1, 0, 1, 1, 1], [0, 0, 1, 0, 1, 0, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 1, 1, 0], [1, 1, 1, 0, 0, 1, 1, 1, 0, 1]] 
+0

Я ценю, что это лучший подход, но я хотел бы понять, почему этот подход не работает. Я думаю, что важно понимать «кишки» Руби. – RobertAKARobin

Смежные вопросы