code: protected static BigInteger createRandomBigIntegerInRange(
        final BigInteger min, final BigInteger max, final SecureRandom random) {
  
      final int cmp = min.compareTo(max);
  
      if (cmp >= 0) {
  
        if (cmp > 0) throw new IllegalArgumentException("'min' may not be greater than 'max'");
  
        return min;
      }
  
      if (min.bitLength() > max.bitLength() / 2)
        return createRandomBigIntegerInRange(BigInteger.ZERO, max.subtract(min), random).add(min);
  
      final int MAX_ITERATIONS = 1000;
  
      for (int i = 0; i < MAX_ITERATIONS; ++i) {
  
        BigInteger x = new BigInteger(max.bitLength(), random);
  
        if (x.compareTo(min) >= 0 && x.compareTo(max) <= 0) return x;
      }
  
      // fall back to a faster (restricted) method
      return new BigInteger(max.subtract(min).bitLength() - 1, random).add(min);
    }
docs: Returns a random big integer in the specified range [min, max].
  
  @param min The least value that may be generated. Must not be {@code null}.
  @param max The greatest value that may be generated. Must not be {@code null}.
  @param random Source of randomness. Must not be {@code null}.
  @return A random big integer in the range [min, max].