web-dev-qa-db-ja.com

Math.random()の説明

これは非常に単純なJavaです(おそらくすべてのプログラミングに当てはまります)。

Math.random()は、0から1までの数値を返します。

0から100までの整数を返したい場合は、次のようにします。

(int) Math.floor(Math.random() * 101)

百から百の間で、私はするだろう:

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

しかし、3〜5の数字を取得したい場合はどうなりますか?次のようになりますか。

(int) Math.random() * 5 + 3

私はJava.lang.util.RandomnextInt()について知っています。しかし、私はこれをMath.random()で行う方法を学びたいです。

125
switz
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

randomWithRange(2, 5)の10回の出力:

5
2
3
3
2
4
4
4
5
4

範囲は包括的、つまり[2,5]で、上の例ではminmaxより小さくなければなりません。

編集: 誰かがminmaxを逆にしようとしてバカになった場合は、コードを次のように変更できます。

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

編集2: doublesについてのあなたの質問のために、それはちょうど:

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

あなたがばかにしたくないならば、それはそれだけです:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}
158
AusCBloke

0から100までの数値を生成したい場合、コードは次のようになります。

(int)(Math.random() * 101);

10から20までの数を生成するには

(int)(Math.random() * 11 + 10);

一般的な場合:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(ここでlowerboundは包括的かつupperbound排他的です).

upperboundを含めるか除外するかは、選択によって異なります。 range = (upperbound - lowerbound) + 1そしてupperboundが包括的だとしましょう、しかしrange = (upperbound - lowerbound)ならupperboundは排他的です。

例:3〜5の整数が必要な場合、rangeが(5-3)+1の場合は5が含まれますが、rangeが(5-3)の場合は5が排他的です。

42
Teezy7

Java.utilパッケージに含まれる Random クラスのJavaは、あなたの目的にかなうでしょう。整数を返す nextInt() メソッドがいくつかあります。 int引数を取るものは0とそのintの間の数を生成します、後者は包括的ではありません。

19
G_H

10から20までの数値を生成するには、Java.util.Randomを使用できます。

int myNumber = new Random().nextInt(11) + 10
1
Ilya Gazman

これは境界を受け取り、ランダムな整数を返すメソッドです。もう少し進んだ(完全に普遍的な)境界は 正と負の両方 であり、最小/最大境界は任意の順序で来ることができます。

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

一般に、境界間の絶対距離を求め、関連するランダムな値を取得してから、下側の境界に基づいて答えをシフトします。

0
fault-tolerant