gpt4 book ai didi

java - 这个损坏的 Java Random.nextInt(long) 行为是怎么回事?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:46 24 4
gpt4 key购买 nike

我发现当你给它一个 2 的幂时,这个方法似乎会惨败) 和 2 的幂(互斥)总是相同;种子无所谓。例如:

public static void main(String[] args) {
Random mRandom;
for (int i = 0; i < 10; i++) {
mRandom = new Random(i);
System.out.println(mRandom.nextInt((int) Math.pow(2, 4)));
}
}

Console:
11
11
11
11
11
11
11
11
11
11

我随意选择了 2^4,但它似乎适用于任何 2 的幂。这是怎么回事?此外,我该如何避免这种情况?

最佳答案

出现这个问题有两个原因。

  1. Random 类的相同种子。
  2. nextInt(int n),如果n是2的幂

1。 Random 类的种子相同。

因为,您已经使用新的 seed 值启动了新的 Random 实例,这会影响 nextInt 值的生成。根据 Random(long seed) 的 Java 文档.

Creates a new random number generator using a single long seed. The seed is the initial value of the internal state of the pseudorandom number generator which is maintained by method next(int).

The invocation new Random(seed) is equivalent to:

Random rnd = new Random();
rnd.setSeed(seed);

如果您尝试生成随机值,没有 new seed,它会生成真正的随机值,即使是 Random 类的新实例。

for (int i = 0; i < 10; i++) {
mRandom = new Random(); // Without seed
System.out.println(mRandom.nextInt((int) Math.pow(2, 4)));
}

输出: 2 1 12 4 3 9 9 8 2 9

2. 在nextInt(int n)处,如果n是2的幂

除此之外,Random#nextInt具有 2 的幂的效果。如果 n 是 2 的幂,它将返回 (int)((n * (long)next(31)) >> 31) 对于相同的 n 始终相同.根据nextInt算法,

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;
}

关于java - 这个损坏的 Java Random.nextInt(long) 行为是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20041387/

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