4

範囲内のランダムについて別の質問があることは知っていますが、それらの回答のどれも私がやろうとしていることを達成していません。実際、彼らには私と同じエラーがあります。範囲でランダムを生成するこの単純な関数を作成しました。

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

範囲が Integer.MAX_VALUE より大きい場合、IllegalArgumentException がスローされます: n は正でなければなりません。オーバーフローして負の数になることがわかっています。私の質問は、それをどのように処理するかです。

範囲の例;

  • [0, Integer.MAX_VALUE]
  • [整数.MIN_VALUE、整数.MAX_VALUE]
  • [-100、Integer.MAX_VALUE]

注: min と max は包括的でなければなりません。

4

4 に答える 4

6

この場合、int は使用できません。BigIntegerを使用する必要があります。次のコンストラクターは、必要なことを行います (もちろん、必要に応じて微調整が必​​要です)。

BigInteger(int numBits, Random rnd) 

0 から (2numBits - 1) までの範囲に均一に分散された、ランダムに生成された BigInteger を構築します。

于 2012-05-27T11:31:15.940 に答える
4

あなたが抱えている問題は、(max - min)オーバーフローして負の値を与えることです。

代わりにa を使用できますlong

public int randomWithRange(int min, int max) {
    return (int) ((m_random.nextLong() & Long.MAX_VALUE) % (1L + max - min)) + min;
}
于 2012-05-27T11:40:38.453 に答える
2

ランダムなdoubleを取得してから、intにキャストバックすることを検討しましたか?

return (int)(m_random.nextDouble() * ((double)max - (double)min) + min);
于 2012-05-27T11:33:51.587 に答える
0

私が考えることができる最も「ばかげているが間違いなく正しい」解決策:

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;
}
于 2012-05-27T11:41:42.393 に答える