将值随机插入到数组数组中

时间:2015-03-27 20:48:47

标签: ruby

我尝试创建一个方法,随机填充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)}"显示的是更改值?

2 个答案:

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