Math.random()の説明


133

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

Math.random() 0と1の間の数を返します。

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

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

1から100の間で、私はそうします:

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

しかし、3〜5の数値を取得したい場合はどうなりますか?次のステートメントのようになりますか?

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

について知ってnextInt()java.lang.util.Randomます。しかし、私はこれをどのように行うかを学びたいですMath.random()


[3,5]の場合:(int)Math.floor(Math.random()*3) + 3
good_evening

9
ところで:範囲は0.0を含み、1.0を含みます(1.0を実際に取得することはありません)。
Peter Lawrey、2011年

2
使用方法Math.ceilが間違っていると、Math.random()が戻っ0たときに誤った結果が返されます。
starblue

Math.floorが0.029を返すとどうなりますか?1つのステートメントで常に2桁の数値を取得する方法は?
Naisheel Verdhan、2015年

回答:


165
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]であり、上記の例minよりも小さくなければなりませんmax

編集:誰かが試してみて、愚かなことと逆にするつもりだった場合minmax、あなたがにコードを変更することができます:

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

EDIT2:double s についての質問は、次のとおりです。

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);
}

1
使用せずに(int)それを返したい場合はどうなりますdoubleか?
switz

double が必要な場合は、intsをdoublesに置き換えてください(型キャストは不要です)。あなたはintsが欲しかったと思いましたが、私の投稿に追加します。
AusCBloke

2
実際にdoublesを削除すると、切り捨てられないため、+ 1も削除Math.random()されます。ただし、範囲は[min、max)になりMath.randomます。「0.0以上で1.0未満の正の符号の付いたdouble値を返す」からです。maxたとえそれが可能であったとしても、とにかく正確に数が存在する可能性はごくわずかです。
AusCBloke

44

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の整数が必要な場合、範囲が(5-3)+1の場合は5が含まれますが、範囲が(5-3)のみの場合は5が含まれません。


2
upperbound独占?包括的になると思います。
16

1
@viditそれは独占的です

1
あなたは、大きな絵のは、UpperBoundは一例で提供される、のいずれかになりますのgettinているとは思わない
Teezy7

19

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


質問を更新しましたMath.random()。でそれを行う方法を知りたいのですが。ありがとう。
スイス

1

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

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

0

境界を受け取り、ランダムな整数を返すメソッドは次のとおりです。それは少し高度です(完全にユニバーサル):境界は正と負の両方になり、最小/最大境界は任意の順序になります。

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);
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.