code: @Override
      public SubsetMove getRandomMove(SubsetSolution solution, Random rnd) {
          // get set of candidate IDs for deletion (fixed IDs are discarded)
          Set<Integer> delCandidates = getRemoveCandidates(solution);
          // compute maximum number of deletions
          int curMaxDel = maxDeletions(delCandidates, solution);
          // return null if no removals are possible
          if(curMaxDel == 0){
              return null;
          }
          // pick number of deletions (in [1, curMaxDel])
          int numDel = rnd.nextInt(curMaxDel) + 1;
          // pick random IDs to remove from selection
          Set<Integer> del = SetUtilities.getRandomSubset(delCandidates, numDel, rnd);
          // create and return move
          return new GeneralSubsetMove(Collections.emptySet(), del);
      }
docs: <p>
  Generates a move for the given subset solution that deselects a random subset of currently selected IDs.
  Possible fixed IDs are not considered to be deselected. The maximum number of deletions \(k\) and minimum
  allowed subset size are respected. If no items can be removed, <code>null</code> is returned.
  </p>
  <p>
  Note that first, a random number of deletions is picked (uniformly distributed) from the valid range and then,
  a random subset of this size is sampled from the currently selected IDs, to be removed (again, all possible
  subsets are uniformly distributed, within the fixed size). Because the amount of possible moves increases with
  the number of performed deletions, the probability of generating each specific move thus decreases with the
  number of deletions. In other words, randomly generated moves are <b>not</b> uniformly distributed across
  different numbers of performed deletions, but each specific move performing fewer deletions is more likely
  to be selected than each specific move performing more deletions.
  </p>
  
  @param solution solution for which a random multi deletion move is generated
  @param rnd source of randomness used to generate random move
  @return random multi deletion move, <code>null</code> if no items can be removed