为什么两个随机生成的数组总是一样的?

时间:2015-11-22 18:02:12

标签: ruby random

我试图生成两个包含随机内容的数组。代码如下:

[@board1, @board2].each do |board|
  15.times { board.place_random_ship }
end

Board课程中,我有以下两种方法:

def place_random_ship
  self.full? ? (raise puts "error") : self.populate_grid
end

def populate_grid
  position = [rand(@grid.length), rand(@grid.length)]
  self.empty?(position) ? self[position] = :s : self.populate_grid
end

我确保我通过的电路板不同:

#<Board:0x007fc8e58641f0>
#<Board:0x007fc8e58641a0>

每次运行我的代码时,内容都会改变,但两个数组总是相同的,我希望它们不同。我尝试将srand放在populate_grid方法的开头,但那并没有做任何事情。如何让我的阵列拥有不同的内容?

类定义和一些可能相关的方法如下:

class Board
  attr_accessor :grid, :default_grid

  @default_grid = Array.new(10) { Array.new(10) }

  def initialize(grid = self.class.default_grid)
    @grid = grid
  end

  def self.default_grid
    Board.new(@default_grid)
    @default_grid
  end

  def [](position)
    @grid[position[1]][position[0]]
  end

  def []=(position, arg)
    @grid[position[1]][position[0]] = arg
  end

一些类方法来自于我必须通过spec文件传递的较旧的,愚蠢的版本。我加载这些文件并将这个ruby代码运行到&#34; play&#34;游戏:

players = { player1: ComputerPlayer.new("rafi"), player2: ComputerPlayer.new("other") }
boards = { board1: Board.new, board2: Board.new }
game = BattleshipGame.new(players, boards)
game.play

这就是网格的样子(空10x10):

[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

这是我运行15次代码后网格的样子:

[:s, :s, nil, :s, nil, :s, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, :s, nil]
[nil, nil, :s, nil, nil, nil, :s, :s, nil, nil]
[nil, nil, nil, nil, nil, nil, :s, nil, nil, nil]
[:s, nil, :s, nil, nil, :s, nil, :s, :s, nil]
[nil, nil, :s, nil, nil, nil, nil, :s, nil, :s]
[:s, nil, nil, nil, nil, :s, :s, nil, :s, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, :s]
[nil, :s, nil, nil, :s, nil, :s, :s, nil, nil]
[nil, nil, :s, nil, :s, :s, nil, nil, :s, nil]

问题是,自代码使用rand以来,两个董事会应该有不同的出货地点,不知何故最终会有完全相同的船位。

1 个答案:

答案 0 :(得分:2)

这是事情开始出错的地方:

  @default_grid = Array.new(10) { Array.new(10) }

  def initialize(grid = self.class.default_grid)

问题是您重新使用 @default_grid对象,因此使用默认值实例化的所有Board实例将共享相同的Array

您应该修改default_grid方法,以便每次都生成新的Array,而不是使用类变量:

  def self.default_grid
    Array.new(10) { Array.new(10) }
  end

你可以摆脱类变量。