code: @NotNull
      public IntStream ints(final int randomNumberOrigin, final int randomNumberBound) {
          if (randomNumberOrigin >= randomNumberBound) {
              throw new IllegalArgumentException();
          }
          return IntStream.generate(new IntSupplier() {
  
              private final int bound = randomNumberBound - randomNumberOrigin;
  
              @Override
              public int getAsInt() {
                  if (bound < 0) {
                      // range not representable as int
                      int result;
                      do {
                          result = random.nextInt();
                      } while (randomNumberOrigin >= result || result >= randomNumberBound);
                      return result;
                  }
                  return randomNumberOrigin + random.nextInt(bound);
              }
          });
      }
docs: Returns an effectively unlimited stream of pseudorandom {@code int}
  values, each conforming to the given origin (inclusive) and bound (exclusive)
  
  @param randomNumberOrigin  the origin (inclusive) of each random value
  @param randomNumberBound  the bound (exclusive) of each random value
  @return a stream of pseudorandom {@code int} values,
  each with the given origin (inclusive) and bound (exclusive)
  @throws IllegalArgumentException if {@code randomNumberOrigin}
  is greater than or equal to {@code randomNumberBound}