根据我的理解(和javadoc),Random.nextInt应该返回一个正(或零)值。
但是,当我将其与2的幂一起使用时,我通常会收到负值。这是我的随机课程:
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;
public class SavableRandom extends Random {
private AtomicLong seed = new AtomicLong();
/** {@inheritDoc} */
@Override
protected int next(int bits) {
long newSeed = seed.get();
newSeed ^= (newSeed << 21);
newSeed ^= (newSeed >>> 35);
newSeed ^= (newSeed << 4);
seed.set(newSeed);
return (int) (newSeed >>> (48 - bits));
}
/** @return the seed. */
public long getSeed() {
return seed.get();
}
/** @param seed the seed to set. */
@Override
public void setSeed(long seed) {
if (this.seed != null) {
this.seed.set(seed);
}
}
public static void main(String... args) {
Random random = new SavableRandom();
random.setSeed(536662536331391686L);
System.out.println(random.nextInt(13));
System.out.println(random.nextInt(12));
System.out.println(random.nextInt(16));
}
}
我添加了具有特定种子的main方法,以便您可以轻松地重现它(最后一个返回-1)。
我究竟做错了什么 ?
我究竟做错了什么 ?
您的newSeed
位数超过48位,因此位数(newSeed >>> (48 - bits))
也超过了bits
,这意味着您违反的合同next(int bits)
。
谢谢 !我可以在解决该问题的方法旁边做什么?
@MKL如果您对位操作有足够的了解,可以提出自己的随机序列算法,那么您应该具有足够的知识,可以使用掩码
&
来清除的除低位以外的所有bits
位int
,例如x & ((1 << bits) - 1)
再次感谢 !我希望这样做不会对概率分布造成太大干扰。