JavaのMath.random()での乱数

乱数を生成するために、私は数式を使用しました:

(int)(Math.random()* max)+ min

私がGoogleで見つけた式は、常に次のように見えます。

(int)(Math.random()*(max - min)+ min)

どちらが正しい?私が知る限り、私は数式を使って私の範囲外の数字を得たことはありません

12
確かに、私がページをリフレッシュするまでに、簡単なポイントを求めている半ダースの答えはあなたのものが間違っていると言えます。あなたの max は、 range または width という名前にする必要があります。
追加された 著者 BlueRaja - Danny Pflughoeft,
あなたは幸運な男のようです。
追加された 著者 WannaBeCoder,

11 答え

数式は分と分+最大の間の数値を生成します。

Googleが見つけたものは、最小値と最大値の間の数値を生成します。

Googleが勝ちます!

14
追加された
完全性のために、「完全」と言うときは、 min を含み、 max を除外することを意味しますか?
追加された 著者 Maarten,

より良いアプローチは次のとおりです。

int x = rand.nextInt(max - min + 1) + min;

数式では、 min から 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

8
追加された

あなた:最小可能な最小は、可能な限り最高ですmax + min-1

Google:可能な限り最低、最小可能なものは最大1

5
追加された
Math.random()は1を返しません
追加された 著者 Alex,
それは本当だ。従って-1。
追加された 著者 F.J,

min = 10max = 100 の場合:

(int)(Math.random() * max) + min        

結果は10〜110になりますが、

(int)(Math.random() * (max - min) + min)

結果は10〜100ですので、非常に異なる数式です。ここで重要なのは明快さです。何をするにしても、コードによって生成される内容が明確になっていることを確認してください。

(PS。変数 'max'を 'range'と呼ぶように変更すると、最初の方が意味があります)

2
追加された

最初のものは間違った範囲の数字を生成し、2番目の数字は正しいものです。

最初のコードが正しくないことを示すには、 min が10で、 max が20であるとします。言い換えれば、結果は10以上、厳密には20未満です。 Math.random()0.75 を返す場合、最初の数式の結果は範囲外の 25 です。

2
追加された
int i = (int) (10 +Math.random()*11);

これはあなたに10から20までの乱数を与えます。

ここの鍵は、

a + Math.random()*b

開始番号(10)および終了番号(num)は最大番号(20)-a(10)+ 1(11)

楽しい!

2
追加された
Jasonさん、Math.randomのJavadocを見て、double> = 0.0で<1.0を返します。 10進数の精度が10位であると仮定すると、10 + Math.random()* 11は20ではなく10..19の範囲の値を返します。[Math.random()の最大値は0.9です。 = 9.9。10 + 9.9 = 19.9。キャストintは、19.9の値を切り捨てるので丸めずにこの値を19に減らします(この場合、Math.round(double_val)は20の長い値を返します)。 int i =(int)(10 + Math.random()* 12);あなたや他の誰かがこれが間違っていると思われる場合は、気軽にコメントしてください。
追加された 著者 Matt Campbell,

Math.random()

     

正の符号を持つdouble値を返します。   0.0未満1.0未満。

今あなたが達成したいことにかかっています。 1から100までの数字を使用する場合は、

(int)(Math.random()*100)

したがって、100は値の範囲です。範囲の開始を20から120に変更する場合は、最後に+20を追加する必要があります。

したがって、公式は次のとおりです。

(int)(Math.random()*range) + min

そして、あなたは常にmax-minで範囲を計算することができます。つまり、Googleがあなたにその式を与える理由です。

1
追加された

min = 5max = 10Math.random()が(ほぼ)1.0を返すと、 )15であり、明らかに選択された max 以上です。

これは、すべての乱数APIが明示的にminとmaxを指定できるようにするためです。問題のドメインに接するエラーの起こりやすい数式を書く必要はありません。

1
追加された
@ F.J私は正しさのために「ほぼ」を付け加えました。私は整数を使った例を理解しやすいので、1.0を選択しました。
追加された 著者 millimoose,
Math.random()は常に1.0より小さい。
追加された 著者 F.J,

Googleは正しい:-)

Google's formula creates numbers between: min and max Your formula creates numbers between: min and (min+max)

1
追加された

Math.random() generates a number between 0 (inclusive) and 1 (exclusive).

したがって、(int)(Math.random()* max)の範囲は 0 から max-1 までです。

min から max + min-1 までの範囲の(int)(Math.random()* max)+ min あなたは欲しい。

Googleの式が正しい。

0
追加された

(int)(Math.random()*(max-min + 1)+ min)(int)ではないGoogleの検索式に小さな問題があります。 (Math.random()*(max - min)+ min)

0
追加された