我认为java随机函数有一个bug。。我说得对吗?

我认为java随机函数有一个bug。。我说得对吗?,java,random,Java,Random,我认为Java随机函数有一些bug 这是因为n可以小于next31,它会扭曲均匀分布。 链接: 如果这就是我认为有问题的原因 原始代码检查条件 位-val+n-10 n-1>=0,因为n是正整数 所以 位-val+n-1将始终大于0 所以循环不会运行两次。。我说得对吗?我提出了一个糟糕的问题。很抱歉上面的代码不是我的。它是驻留在JavaSDK中的随机类。你可以通过编辑问题来修正它。尽可能把它弄清楚。我当然会投赞成票。插入一个循环计数器,如果循环运行不止一次,让它打印一条消息——我试过了。为什么?

我认为Java随机函数有一些bug

这是因为n可以小于next31,它会扭曲均匀分布。 链接:

如果这就是我认为有问题的原因

原始代码检查条件

位-val+n-1<0

但位将始终大于val=位%n,且n为正整数 所以位-val>0

n-1>=0,因为n是正整数

所以

位-val+n-1将始终大于0
所以循环不会运行两次。。我说得对吗?

我提出了一个糟糕的问题。很抱歉上面的代码不是我的。它是驻留在JavaSDK中的随机类。你可以通过编辑问题来修正它。尽可能把它弄清楚。我当然会投赞成票。插入一个循环计数器,如果循环运行不止一次,让它打印一条消息——我试过了。为什么?我有一个怀疑,但我不知道,自己找出来提示:你已经在打印东西了,打印什么/什么时候打印要明智!。请注意,a>0,b>=0并不意味着a+b>0
private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;

protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}



public int nextInt(int n) {
    if (n <= 0)
        throw new IllegalArgumentException("n must be positive");

    if ((n & -n) == n)  // i.e., n is a power of 2
        return (int)((n * (long)next(31)) >> 31);

    int bits, val;
    do {
        bits = next(31);
        val = bits % n;
    } while (bits - val + (n-1) < 0);
    return val;
}
next(31) % n