import typing

import java
import java.chaquopy
import java.lang
import java.math
import java.util.stream

class RandomGenerator(java.lang.Object):
    @typing.overload
    def doubles(self) -> java.util.stream.DoubleStream: ...
    @typing.overload
    def doubles(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.DoubleStream: ...
    @typing.overload
    def doubles(self, randomNumberOrigin: float | java.jdouble | java.lang.Double, randomNumberBound: float | java.jdouble | java.lang.Double, /) -> java.util.stream.DoubleStream: ...
    @typing.overload
    def doubles(self, streamSize: int | java.jlong | java.lang.Long, randomNumberOrigin: float | java.jdouble | java.lang.Double, randomNumberBound: float | java.jdouble | java.lang.Double, /) -> java.util.stream.DoubleStream: ...
    @staticmethod
    def getDefault() -> RandomGenerator: ...
    @typing.overload
    def ints(self) -> java.util.stream.IntStream: ...
    @typing.overload
    def ints(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.IntStream: ...
    @typing.overload
    def ints(self, randomNumberOrigin: int | java.jint | java.lang.Integer, randomNumberBound: int | java.jint | java.lang.Integer, /) -> java.util.stream.IntStream: ...
    @typing.overload
    def ints(self, streamSize: int | java.jlong | java.lang.Long, randomNumberOrigin: int | java.jint | java.lang.Integer, randomNumberBound: int | java.jint | java.lang.Integer, /) -> java.util.stream.IntStream: ...
    def isDeprecated(self) -> bool: ...
    @typing.overload
    def longs(self) -> java.util.stream.LongStream: ...
    @typing.overload
    def longs(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.LongStream: ...
    @typing.overload
    def longs(self, randomNumberOrigin: int | java.jlong | java.lang.Long, randomNumberBound: int | java.jlong | java.lang.Long, /) -> java.util.stream.LongStream: ...
    @typing.overload
    def longs(self, streamSize: int | java.jlong | java.lang.Long, randomNumberOrigin: int | java.jlong | java.lang.Long, randomNumberBound: int | java.jlong | java.lang.Long, /) -> java.util.stream.LongStream: ...
    def nextBoolean(self) -> bool: ...
    def nextBytes(self, bytes: java.chaquopy.JavaArrayJByte, /) -> None: ...
    @typing.overload
    def nextDouble(self) -> float: ...
    @typing.overload
    def nextDouble(self, bound: float | java.jdouble | java.lang.Double, /) -> float: ...
    @typing.overload
    def nextDouble(self, origin: float | java.jdouble | java.lang.Double, bound: float | java.jdouble | java.lang.Double, /) -> float: ...
    def nextExponential(self) -> float: ...
    @typing.overload
    def nextFloat(self) -> float: ...
    @typing.overload
    def nextFloat(self, bound: float | java.jfloat | java.lang.Float, /) -> float: ...
    @typing.overload
    def nextFloat(self, origin: float | java.jfloat | java.lang.Float, bound: float | java.jfloat | java.lang.Float, /) -> float: ...
    @typing.overload
    def nextGaussian(self) -> float: ...
    @typing.overload
    def nextGaussian(self, mean: float | java.jdouble | java.lang.Double, stddev: float | java.jdouble | java.lang.Double, /) -> float: ...
    @typing.overload
    def nextInt(self) -> int: ...
    @typing.overload
    def nextInt(self, bound: int | java.jint | java.lang.Integer, /) -> int: ...
    @typing.overload
    def nextInt(self, origin: int | java.jint | java.lang.Integer, bound: int | java.jint | java.lang.Integer, /) -> int: ...
    @typing.overload
    def nextLong(self) -> int: ...
    @typing.overload
    def nextLong(self, bound: int | java.jlong | java.lang.Long, /) -> int: ...
    @typing.overload
    def nextLong(self, origin: int | java.jlong | java.lang.Long, bound: int | java.jlong | java.lang.Long, /) -> int: ...
    @staticmethod
    def of(name: str | java.lang.String, /) -> RandomGenerator: ...

    class StreamableGenerator(RandomGenerator):
        @staticmethod
        def of(name: str | java.lang.String, /) -> RandomGenerator.StreamableGenerator: ...
        @typing.overload
        def rngs(self) -> java.util.stream.Stream[RandomGenerator]: ...
        @typing.overload
        def rngs(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator]: ...

    class SplittableGenerator(RandomGenerator.StreamableGenerator):
        @staticmethod
        def of(name: str | java.lang.String, /) -> RandomGenerator.SplittableGenerator: ...
        @typing.overload
        def rngs(self) -> java.util.stream.Stream[RandomGenerator]: ...
        @typing.overload
        def rngs(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator]: ...
        @typing.overload
        def split(self) -> RandomGenerator.SplittableGenerator: ...
        @typing.overload
        def split(self, arg1: RandomGenerator.SplittableGenerator, /) -> RandomGenerator.SplittableGenerator: ...
        @typing.overload
        def splits(self) -> java.util.stream.Stream[RandomGenerator.SplittableGenerator]: ...
        @typing.overload
        def splits(self, arg1: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator.SplittableGenerator]: ...
        @typing.overload
        def splits(self, arg1: RandomGenerator.SplittableGenerator, /) -> java.util.stream.Stream[RandomGenerator.SplittableGenerator]: ...
        @typing.overload
        def splits(self, arg1: int | java.jlong | java.lang.Long, arg2: RandomGenerator.SplittableGenerator, /) -> java.util.stream.Stream[RandomGenerator.SplittableGenerator]: ...

    class LeapableGenerator(RandomGenerator.JumpableGenerator):
        def copy(self) -> RandomGenerator.LeapableGenerator: ...
        def copyAndLeap(self) -> RandomGenerator.JumpableGenerator: ...
        def leap(self) -> None: ...
        def leapDistance(self) -> float: ...
        @typing.overload
        def leaps(self) -> java.util.stream.Stream[RandomGenerator.JumpableGenerator]: ...
        @typing.overload
        def leaps(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator.JumpableGenerator]: ...
        @staticmethod
        def of(name: str | java.lang.String, /) -> RandomGenerator.LeapableGenerator: ...

    class JumpableGenerator(RandomGenerator.StreamableGenerator):
        def copy(self) -> RandomGenerator.JumpableGenerator: ...
        def copyAndJump(self) -> RandomGenerator: ...
        def jump(self) -> None: ...
        def jumpDistance(self) -> float: ...
        @typing.overload
        def jumps(self) -> java.util.stream.Stream[RandomGenerator]: ...
        @typing.overload
        def jumps(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator]: ...
        @staticmethod
        def of(name: str | java.lang.String, /) -> RandomGenerator.JumpableGenerator: ...
        @typing.overload
        def rngs(self) -> java.util.stream.Stream[RandomGenerator]: ...
        @typing.overload
        def rngs(self, streamSize: int | java.jlong | java.lang.Long, /) -> java.util.stream.Stream[RandomGenerator]: ...

    class ArbitrarilyJumpableGenerator(RandomGenerator.LeapableGenerator):
        def copy(self) -> RandomGenerator.ArbitrarilyJumpableGenerator: ...
        def copyAndJump(self, distance: float | java.jdouble | java.lang.Double, /) -> RandomGenerator.ArbitrarilyJumpableGenerator: ...
        @typing.overload
        def jump(self) -> None: ...
        @typing.overload
        def jump(self, arg1: float | java.jdouble | java.lang.Double, /) -> None: ...
        def jumpPowerOfTwo(self, arg1: int | java.jint | java.lang.Integer, /) -> None: ...
        @typing.overload
        def jumps(self, distance: float | java.jdouble | java.lang.Double, /) -> java.util.stream.Stream[RandomGenerator.ArbitrarilyJumpableGenerator]: ...
        @typing.overload
        def jumps(self, streamSize: int | java.jlong | java.lang.Long, distance: float | java.jdouble | java.lang.Double, /) -> java.util.stream.Stream[RandomGenerator.ArbitrarilyJumpableGenerator]: ...
        def leap(self) -> None: ...
        @staticmethod
        def of(name: str | java.lang.String, /) -> RandomGenerator.ArbitrarilyJumpableGenerator: ...

_RandomGeneratorFactory__T = typing.TypeVar('_RandomGeneratorFactory__T')  # <T>
class RandomGeneratorFactory(java.lang.Object, typing.Generic[_RandomGeneratorFactory__T]):
    @staticmethod
    def all() -> java.util.stream.Stream[RandomGeneratorFactory[RandomGenerator]]: ...
    @typing.overload
    def create(self) -> _RandomGeneratorFactory__T: ...
    @typing.overload
    def create(self, seed: int | java.jlong | java.lang.Long, /) -> _RandomGeneratorFactory__T: ...
    @typing.overload
    def create(self, seed: java.chaquopy.JavaArrayJByte, /) -> _RandomGeneratorFactory__T: ...
    def equidistribution(self) -> int: ...
    @staticmethod
    def getDefault() -> RandomGeneratorFactory[RandomGenerator]: ...
    def group(self) -> str: ...
    def isArbitrarilyJumpable(self) -> bool: ...
    def isDeprecated(self) -> bool: ...
    def isHardware(self) -> bool: ...
    def isJumpable(self) -> bool: ...
    def isLeapable(self) -> bool: ...
    def isSplittable(self) -> bool: ...
    def isStatistical(self) -> bool: ...
    def isStochastic(self) -> bool: ...
    def isStreamable(self) -> bool: ...
    def name(self) -> str: ...
    @staticmethod
    def of(name: str | java.lang.String, /) -> RandomGeneratorFactory[java.lang.Object]: ...
    def period(self) -> java.math.BigInteger: ...
    def stateBits(self) -> int: ...
