簡體   English   中英

選擇大於Integer.MAX_VALUE的范圍內的隨機整數?

[英]Choose random integer in a range bigger than Integer.MAX_VALUE?

我知道在一個范圍內還有另外一個關於隨機的問題,但他們的答案都沒有完成我想要做的事情。 實際上他們有同樣的錯誤。 我寫了這個簡單的函數來生成隨機范圍。

Random m_random = new Random();
...
public int RandomWithRange(int min, int max) {
    return m_random.nextInt(max - min + 1) + min;
}

如果range大於Integer.MAX_VALUE,則拋出IllegalArgumentException:n必須為正數。 我知道它溢出並轉向負數。 我的問題是如何處理?

示例范圍;

  • [0,Integer.MAX_VALUE]
  • [Integer.MIN_VALUE,Integer.MAX_VALUE]
  • [-100,Integer.MAX_VALUE]

注意:min和max必須包含在內。

在這種情況下,您不能使用int。 你需要使用BigInteger 以下構造函數執行您想要的操作(當然需要根據您的需要進行調整):

BigInteger(int numBits, Random rnd) 

構造一個隨機生成的BigInteger,均勻分布在0到(2numBits - 1)的范圍內,包括0和(2numBits - 1)。

你遇到的問題是(max - min)溢出並給你一個負值。

你可以使用long而不是。

public int randomWithRange(int min, int max) {
    return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}

你有沒有考慮過隨機加倍然后再回到int

return (int)(m_random.nextDouble() * ((double)max - (double)min) + min);

我能想到的最“愚蠢但絕對正確”的解決方案:

if (max - min + 1 > 0) // no overflow
  return delta + random.nextInt(max - min + 1);
else {
  int result;
  do {
    result = random.nextInt();
  } while (result < min || result > max);
  // finishes in <= 2 iterations on average
  return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM