@Override
	public void createRandomPuzzle() {
		reset(); // first, clear out any existing entries
		
		// independent boxes : I can set any number in any of these boxes without constraint
		
		Random random = new Random();
		
		int[][] independentBoxes = {
				{ 1, 6, 11, 16 },
				{ 1, 6, 12, 15 },
				{ 1, 7, 10, 16 },
				{ 1, 7, 12, 14 },
				{ 1, 8, 10, 15 },
				{ 1, 8, 11, 14 },

				{ 2, 5, 11, 16 },
				{ 2, 5, 12, 15 },
				{ 2, 7,  9, 16 },
				{ 2, 7, 12, 13 },
				{ 2, 8,  9, 14 },
				{ 2, 8, 11, 13 },
				
				{ 3, 5, 10, 16 },
				{ 3, 5, 12, 14 },
				{ 3, 6,  9, 16 },
				{ 3, 6, 12, 13 },
				{ 3, 8,  9, 14 },
				{ 3, 8, 10, 13 },

				{ 4, 5, 10, 15 },
				{ 4, 5, 11, 14 },
				{ 4, 6,  9, 15 },
				{ 4, 6, 11, 13 },
				{ 4, 7,  9, 14 },
				{ 4, 7, 10, 13 },
		};
		
		int[] boxSeeds = independentBoxes[ random.nextInt(independentBoxes.length)];
		
		for (int i : boxSeeds) {
			System.out.println(i);
		}
		
		for (int i : boxSeeds) {
			Sexdectet box = boxes.get(i - 1);
			List<Cell> cells = box.getCells();
			
			List<Integer> seed = Arrays.asList( 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 );
			Collections.shuffle(seed);

			for (int c = 0; c < 16; c++) {
				try {
					Cell cell = cells.get(c);
					cell.setValue(seed.get(c));
				} catch (CellContentException e) {
					System.err.println("Shouldn't happen " + e);
				} 
			}			
		}
		
		// fill in the missing entries
		
		solveBruteForce();
		
		System.out.println(toCLIString());
		
		// now try to remove entries until the solution is not unique anymore
		
		// first, we get all Cells and shuffle them
		
		List<Cell> allCells = getCells().values().stream().collect(Collectors.toList());
		Collections.shuffle(allCells);
		
		int counter = 0;
		
		for (Cell c : allCells) {
			int value = c.getValue();
			c.reset();

			// for now, need to solve performance problems
			
			if (counter++ > 200) break;
			
			if (isUnique() > 1) {
				try {
					// does not produce unique puzzle, reset this value
					c.setValue(value);
				} catch (CellContentException e) {
					System.err.println("Should not happen " + e);
				}
			}
		}
		
		for (Cell c : allCells) {
			c.makeReadOnly();
		}
	}