このアプローチはnextInt
、https://stackoverflow.com/a/738651/360211のアプローチよりもバイアスがかかり効率が悪いことに注意してください。
これを実現するための1つの標準パターンは次のとおりです。
Min + (int)(Math.random() * ((Max - Min) + 1))
Javaの数学ライブラリ関数Math.random()の範囲内のdouble値を生成します[0,1)
。この範囲には1が含まれていないことに注意してください。
特定の範囲の値を最初に取得するには、対象とする値の範囲の大きさを掛ける必要があります。
Math.random() * ( Max - Min )
これは、[0,Max-Min)
「Max-Min」が含まれていない範囲の値を返します。
たとえば、[5,10)
必要な場合は、5つの整数値をカバーする必要があるため、
Math.random() * 5
これは[0,5)
、5が含まれない範囲の値を返します。
次に、この範囲をターゲットとする範囲にシフトする必要があります。これを行うには、最小値を追加します。
Min + (Math.random() * (Max - Min))
範囲内の値を取得します[Min,Max)
。私たちの例に従うと、それは[5,10)
次を意味します:
5 + (Math.random() * (10 - 5))
しかし、これにはまだ含まれておらずMax
、二重の値を取得しています。Max
含まれる値を取得するには、範囲パラメーターに1を追加して(Max - Min)
から、intにキャストして小数部を切り捨てる必要があります。これは、以下を介して実行されます。
Min + (int)(Math.random() * ((Max - Min) + 1))
そして、そこにあります。範囲内[Min,Max]
、または例ごとのランダムな整数値[5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))