gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:37:25 26 4
gpt4 key购买 nike

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

我做错了什么?

最佳答案

What am I doing wrong ?

您的 newSeed 超过 48 位,因此 (newSeed >>> (48 - 位)) 超过 bits 位,这意味着您违反了 next(int bits) 的契约(Contract).

关于java - 使用 XORShift 种子实现从 Random.nextInt 获取负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60007366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com