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