乱数を生成するために、私は数式を使用しました:
(int)(Math.random()* max)+ min
私がGoogleで見つけた式は、常に次のように見えます。
(int)(Math.random()*(max - min)+ min)
どちらが正しい?私が知る限り、私は数式を使って私の範囲外の数字を得たことはありません
max
range
width
数式は分と分+最大の間の数値を生成します。
Googleが見つけたものは、最小値と最大値の間の数値を生成します。
Googleが勝ちます!
min
より良いアプローチは次のとおりです。
int x = rand.nextInt(max - min + 1) + min;
数式では、 min から min + max までの数値が生成されます。
min + max
Random random = new Random(1234567); int min = 5; int max = 20; while (true) { int x = (int)(Math.random() * max) + min; System.out.println(x); if (x < min || x >= max) { break; } }
結果:
10 16 13 21//Oops!!
See it online here: ideone
あなた:最小可能な最小は、可能な限り最高ですmax + min-1
Google:可能な限り最低、最小可能なものは最大1
min = 10 、 max = 100 の場合:
min = 10
max = 100
(int)(Math.random() * max) + min
結果は10〜110になりますが、
(int)(Math.random() * (max - min) + min)
結果は10〜100ですので、非常に異なる数式です。ここで重要なのは明快さです。何をするにしても、コードによって生成される内容が明確になっていることを確認してください。
(PS。変数 'max'を 'range'と呼ぶように変更すると、最初の方が意味があります)
最初のものは間違った範囲の数字を生成し、2番目の数字は正しいものです。
最初のコードが正しくないことを示すには、 min が10で、 max が20であるとします。言い換えれば、結果は10以上、厳密には20未満です。 Math.random()が 0.75 を返す場合、最初の数式の結果は範囲外の 25 です。
Math.random()
0.75
25
int i = (int) (10 +Math.random()*11);
これはあなたに10から20までの乱数を与えます。
ここの鍵は、
a + Math.random()*b
開始番号(10)および終了番号(num)は最大番号(20)-a(10)+ 1(11)
楽しい!
Math.random() 正の符号を持つdouble値を返します。 0.0未満1.0未満。
正の符号を持つdouble値を返します。 0.0未満1.0未満。
今あなたが達成したいことにかかっています。 1から100までの数字を使用する場合は、
(int)(Math.random()*100)
したがって、100は値の範囲です。範囲の開始を20から120に変更する場合は、最後に+20を追加する必要があります。
したがって、公式は次のとおりです。
(int)(Math.random()*range) + min
そして、あなたは常にmax-minで範囲を計算することができます。つまり、Googleがあなたにその式を与える理由です。
min = 5 、 max = 10 、 Math.random()が(ほぼ)1.0を返すと、 )15であり、明らかに選択された max 以上です。
min = 5
max = 10
これは、すべての乱数APIが明示的にminとmaxを指定できるようにするためです。問題のドメインに接するエラーの起こりやすい数式を書く必要はありません。
Googleは正しい:-)
Google's formula creates numbers between: min and max Your formula creates numbers between: min and (min+max)
Math.random() generates a number between 0 (inclusive) and 1 (exclusive).
Math.random()
したがって、(int)(Math.random()* max)の範囲は 0 から max-1 までです。
(int)(Math.random()* max)
0
max-1
min から max + min-1 までの範囲の(int)(Math.random()* max)+ min あなたは欲しい。
max + min-1
Googleの式が正しい。
(int)(Math.random()*(max-min + 1)+ min)(int)ではないGoogleの検索式に小さな問題があります。 (Math.random()*(max - min)+ min)
(int)ではないGoogleの検索式に小さな問題があります。 (Math.random()*(max - min)+ min)