什么是"有效无限流"的意思

Meh*_*lik 4 java random stream java-8 java-stream

我正在阅读java 8 Random类中的新增强功能,并且这个术语有效地无限流使用重复.

考虑IntStream整数(int randomNumberOrigin,int randomNumberBound):

返回有效无限的伪随机int值流,每个值符合给定的原点(包括)和绑定(不包括).

有人可以解释这个术语.

Era*_*ran 5

这意味着您可以将其视为无限制,但从技术上讲,它可能不是无限制的.例如,openjdk 8u40-b25实现返回Long.MAX_VALUE元素流:

public IntStream ints(int randomNumberOrigin, int randomNumberBound) {
    if (randomNumberOrigin >= randomNumberBound)
        throw new IllegalArgumentException(BadRange);
    return StreamSupport.intStream
            (new RandomIntsSpliterator
                     (this, 0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound),
             false);
}
Run Code Online (Sandbox Code Playgroud)

你看到它打电话了new RandomIntsSpliterator (this, 0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound).

Javadoc RandomIntsSpliterator说:

用于int流的Spliterator.我们将四个int版本复用到一个类中,方法是将一个小于起始的边界视为无界,并将"无限"视为等同于Long.MAX_VALUE.对于拆分,它使用标准的二分法.除类型外,此类的长版和双版版本相同.

这意味着"有效无限流"在这里被实现为具有许多元素(Long.MAX_VALUE其中)的实际有限流.出于所有实际目的,我猜它可以被视为无限流,因为任何人都希望使用这种方法产生比Long.MAX_VALUE随机ints 更多的机会可能非常小.

如果你看一个类似的变体,ints它会返回IntStream一个请求的大小:

public IntStream ints(long streamSize, int randomNumberOrigin,
                      int randomNumberBound) {
    if (streamSize < 0L)
        throw new IllegalArgumentException(BadSize);
    if (randomNumberOrigin >= randomNumberBound)
        throw new IllegalArgumentException(BadRange);
    return StreamSupport.intStream
            (new RandomIntsSpliterator
                     (this, 0L, streamSize, randomNumberOrigin, randomNumberBound),
             false);
}
Run Code Online (Sandbox Code Playgroud)

你看到那个叫

ints(min,max)
Run Code Online (Sandbox Code Playgroud)

相当于打电话

ints(Long.MAX_VALUE,min,max)
Run Code Online (Sandbox Code Playgroud)

至少在这个实现中.

  • @MehrajMalik:`java.util.Random`在2⁴⁸值后开始重复,所以如果你的短路标准在281474976710656元素之后没有达到,比如几天之后,你可以杀死你的应用程序,否则,即使你设法在一个纳秒内处理一个值,你需要将近三百年的时间来处理`Long.MAX_VALUE`元素.但请注意,永远不是无限流的保证属性,只是一个技术限制,例如`random.ints().average()`可以在有限的时间内计算,如果流没有任何错误. (6认同)