温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Getting negative value from Random.nextInt using XORShift seed implementation
java random

java - 使用XORShift种子实现从Random.nextInt获取负值

发布于 2020-04-06 00:06:04

根据我的理解(和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)。

我究竟做错了什么 ?

查看更多

提问者
MKL
被浏览
88
Andreas 2020-02-01 00:39

我究竟做错了什么 ?

您的newSeed位数超过48位,因此位数(newSeed >>> (48 - bits))也超过了bits,这意味着您违反的合同next(int bits)