2014-04-05 103 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

相關問題