gpt4 book ai didi

Java随机给出负数

转载 作者:IT老高 更新时间:2023-10-28 20:56:55 27 4
gpt4 key购买 nike

我在使用 Java 的 Random 类时遇到问题,如果我这样做:

Random rng = new Random(seed) // seed == 29 in this example

String ss = "";
for(int i = 0; i < 10; i++)
{
int s = rng.nextInt();
ss += Integer.toString(s);
ss +="\n";
}

这是我得到的:

-1169335537
-2076183625
1478047223
1914482305
722089687
2094672350
-1234724057
-1614953544
-321574001
1000360613

根据我的阅读,这应该只返回正数作为开始?

这可能有点牵强,但它与在 Windows 7 64 位上运行 64 位机器没有任何关系?

为了完成今天的作业,任何帮助都非常棒!

最佳答案

来自 Java docs for nextInt() :

All 232 possible int values are produced with (approximately) equal probability.

一种方法是使用以下变换:

s =  rng.nextInt() & Integer.MAX_VALUE; // zero out the sign bit

需要这样的东西(而不是使用绝对值或否定)的原因是 Integer.MIN_VALUE 的绝对值太大而无法转换为正整数。也就是说,由于溢出,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUEInteger.MIN_VALUE == -Integer.MIN_VALUE。上面的转换保留了近似均匀的分布特性:如果你编写了一个生成和测试循环,它只是丢弃了 Integer.MIN_VALUE 并返回了其他所有内容的绝对值,那么正整数将是两倍可能性为零。通过将 Integer.MIN_VALUE 映射到零,使零的概率与正整数一致。

这是另一种方法,实际上可能会快一点(尽管我没有对其进行基准测试):

int s = rng.next(Integer.SIZE - 1); // Integer.SIZE == 32

这将生成一个具有 31 个随机低位的整数(并且 0 作为 32nd 位,保证非负值)。但是(正如 jjb 的评论中指出的那样),由于 next(int)Randomprotected 方法,因此您必须子类 Random 以公开方法(或为方法提供合适的代理):

public class MyRandom extends Random {
public MyRandom() {}
public MyRandom(int seed) { super(seed); }

public int nextNonNegative() {
return next(Integer.SIZE - 1);
}
}

另一种方法是使用包装 4 字节数组的 ByteBuffer。然后,您可以生成一个随机的四个字节(通过调用 nextBytes(byte[])),将符号位清零,然后将值作为 int 读取。我不相信这比上述有任何优势,但我想我会把它扔在那里。它与我的第一个解决方案基本相同(使用 Integer.MAX_VALUE 进行掩码)。

在此答案的早期版本中,我建议使用:

int s = rng.nextInt(Integer.MAX_VALUE);

但是,根据 the docs这将生成 0(包括)到 Integer.MAX_VALUE(不包括)范围内的整数。换句话说,它不会生成值 Integer.MAX_VALUE。此外,事实证明 next(int) 总是比 nextInt(int) 快。

关于Java随机给出负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5827023/

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