public static <T> SortedMap<Integer, List<T>> splitListIntoRoughlyEqualSizePartsPseudoRandomly(long seed,
			Collection<T> list, int parts) {

		if (parts <= 1) {
			return new TreeMap<Integer, List<T>>(Collections.singletonMap(1, new LinkedList<T>(list)));
		}

		Random random = new Random(seed);

		SortedMap<Integer, List<T>> map = new TreeMap<Integer, List<T>>();
		for (int i = 0; i < parts; i++) {
			map.put(i, new LinkedList<T>());
		}

		for (T item : list) {
			int minIndex = random.nextInt(parts);
			List<Integer> indicies = new LinkedList<Integer>(map.keySet());
			Collections.shuffle(indicies, random);
			for (Integer x : indicies) {
				int size = map.get(x).size();
				if (size < map.get(minIndex).size()) {
					minIndex = x;
				}
			}
			map.get(minIndex).add(item);
		}

		return map;
	}