public SudokuBoard obfuscate(SudokuBoard board, float percentage) {
    if (percentage < 0f || percentage > 1f) {
      Log.output(
          "ERROR: Cannot obfuscate board. Percentage value is invalid (0 <= percentage <= 1): "
              + percentage);
      return null;
    }

    if (!board.isFilled()) {
      Log.output("ERROR: Cannot obfuscate board. Board contains a zero-value.");
      return null;
    }

    int size = board.getBoardSize();
    int removalCount = (int) (Math.pow(board.getBoardSize(), 2) * percentage);
    SudokuBoard puzzle = new SudokuBoard(board);

    int row;
    int column;
    int value;
    while (removalCount > 0) {
      row = r.nextInt(size);
      column = r.nextInt(size);
      value = puzzle.getCell(row, column);

      // TODO: Keep track of values that have already been cleared and prevent them from being
      // selected again.
      if (value != 0) {
        puzzle.setCell(row, column, 0);
        removalCount--;
      }
    }

    return puzzle;
  }