当前位置: 首页 > 面试题库 >

Java随机给出负数

贺英悟
2023-03-14
问题内容

Random如果这样做,我遇到了Java 类问题:

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文档中获得nextInt()

所有2 32个 可能的int值都是(近似)相等的概率产生的。

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

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作为32
次位,保证一个非负的值)。但是(正如jjb的注释中指出的那样),由于next(int)是的protected方法Random,因此您必须子类化Random以公开该方法(或为该方法提供合适的代理):

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

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

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

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

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

但是,根据文档,这将生成范围为0(含)至Integer.MAX_VALUE(不含)的整数。换句话说,它不会产生value
Integer.MAX_VALUE。此外,事实证明,next(int)它总是比快nextInt(int)



 类似资料:
  • 问题内容: 假设您要生成一个随机数,但希望它小于指定的数量。这可能吗? 问题答案: 文档位于:http : //docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt(int)

  • 如果我做:Math.random() * 4-2 这会让我得到一个范围(-2,2),2是排他性的吗?我认为这是正确的,但我很少得到正数(是的,我知道这是一个随机算法,我们必须无限随机地生成它才能感觉到,但我只是想确保) 新问题 如果我想要所有从-1到1的随机有理数,两个边界都包括在内,那么这条线是否有效:Math.random() * 2.00000000000000001 - 1; 我查了一下,

  • 问题内容: 我正在尝试在short原始数据类型的范围内(-32768,32767)生成随机整数。java Random对象仅生成正数。我将如何在该间隔内随机创建数字?谢谢。 问题答案: 您随机选择,然后减去

  • 问题内容: 我通过执行以下功能将传入的字符串转换为哈希码,但其中一些值为负数。我不认为哈希值应该为负。请告诉我我在做什么错。 问题答案: 我不认为哈希值应该为负。 为什么不?具有负哈希码是完全有效的。提出哈希码的大多数方法自然都以负值结尾,处理它们的任何事情都应考虑到这一点。但是,我会考虑采用另一种方法来计算您的哈希码,例如 目前尚不清楚这些表达式的类型是什么,但是我猜想您最终将要使用字符串的哈希

  • 问题内容: 当他每次运行程序时都不断获得相同的数字时,我试图向Java解释随机数生成器。我为同一件事创建了自己的简单版本,每次运行该程序时,我也得到了与他得到的确切数字相同的数字。 我究竟做错了什么? 100个数字中的最后五个数字是: 问题答案: 您已经为随机数生成器提供了恒定的值。它是确定性的,因此每次运行都会生成相同的值。 我不确定您为什么选择使用作为种子,但是种子值与生成的值范围无关(这是由

  • 本文向大家介绍Java 生成给定范围内的随机数,包括了Java 生成给定范围内的随机数的使用技巧和注意事项,需要的朋友参考一下 为了生成给定范围内的随机数,Java代码如下- 示例 输出结果 名为Demo的类包含主要功能。在这里,将创建一个新的随机实例以及一个新的数组列表。创建随机元素并将其分配给变量。使用add函数将这些随机变量添加到列表中。这些元素显示在控制台上。