我尝试创建一个方法,随机填充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 :(得分:2)
它不起作用的原因是因为你的span函数。如果要创建初始值,它可以正常工作:
span(@width)
这将为您提供以下数组:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
但是当你第二次调用它并传入该数组时,push不会生成该数组的10个副本。相反,它将对该数组的引用推送10次。所以,如果你这样做并不重要
@grid[3][5]
或@grid[0][5]
他们都是同一个地方。
答案 1 :(得分: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]]