2014-04-05 65 views
1

请不要关闭这个作为重复: How to generate random positive and negative numbers in java在一个范围内生成一个随机数。没有Overlflow。在Java

我需要使用一个随机数发生器用种子。所以,我使用了java.util.Random类和constructor类,它需要一个种子。

Random random = new Random(System.currentTimeMillis()); 

然后我用在上述螺纹给出

int randomValue = random.nextInt(max - min + 1) + min; 

然而该解决方案,在上述溶液中的问题是,如果min是一个大的负号和max是一个大的正数,那么(max - min + 1)会导致溢出。

应该有更好的解决方案。任何人都可以请指点我吧。

谢谢!

+1

这的确是,_unless_您提供更多信息重复。 – devnull

+0

嗨devnull,我提供的信息为什么不是重复的。原因是(最大 - 最小+ 1)可能导致溢出。 – user544192

+0

@devnull:除非我误解,否则链接的答案不会触及涉及“Integer.MIN_VALUE”和“Integer.MAX_VALUE”的假设情况,这看起来像是一个有效的担忧。 –

回答

0

如何使用BigInteger来避免int溢出。你也可以使用

new BigInteger(int numBits, Random rnd) 

创造一些BigInteger与随机位(最多可以有numBits指定位)。因此,只需计算需要的位数(range.bitLength()可能有用),检查随机化的值是否在指定的范围内,所以如果值大于范围再次随机,如果一切正常,则返回随机值增加min

下面是一些代码示例

public static int myRandom(int min, int max, Random r){ 
    if (max <= min) 
     throw new RuntimeException("max value must be greater than min value: max="+max +", min="+min); 

    BigInteger maxB = BigInteger.valueOf(max); 
    BigInteger minB = BigInteger.valueOf(min); 

    BigInteger range = maxB.subtract(minB); 
    do{ 
     BigInteger result = new BigInteger(range.bitLength(), r); 
     if (result.compareTo(range)<=0) 
      return result.add(minB).intValueExact(); 
    }while(true); 
} 
+0

由此产生的随机函数可能不会一致。 – assylias

+0

@assylias我不知道我是否明白你的意思是由制服(我不是英语母语:/),而是从我在[BigInteger(int numBits,Random rnd)构造函数]的文档中看到的内容(http:// docs .oracle.com/javase/8/docs/api/java/math/BigInteger.html#BigInteger-int-java.util.Random-)“* ... ** uniform **分布在范围0到(2^numBits - 1)*“那么你能说更多关于这个代码的问题吗?我真的犯了一些错误吗? – Pshemo

+0

“*如果值大于范围随机再次*”=>您可能会通过这样做在分配中引入偏差。尽管OP可能不是问题。 – assylias

相关问题