範囲内でランダムなdoubleを生成します


143

私は次のような2つのダブルスを持っています

double min = 100;
double max = 101;

ランダムジェネレーターを使用して、minとmaxの範囲の間にdouble値を作成する必要があります。

Random r = new Random();
r.nextDouble();

しかし、ここで範囲を指定できる場所はありません。

回答:


237

rangeMinとの間でランダムな値を生成するにはrangeMax

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
これは通常は正しいですが、その制限に注意してください。あなたが行う場合double rangeMax= Double.MAX_VALUE;double rangeMin= -rangeMax;、あなたは常に見返りに無限の値を取得します。を確認したい場合がありDouble.valueOf(rangeMax-rangeMin).isInfinite()ます。
2014

この結果では、範囲が0.0〜1.0より大きい場合、目的の範囲の多くのdouble値が除外されることがよくあります。目的の範囲に0.0〜1.0の範囲よりも多くの値が含まれている場合、それぞれの値はなく、生成されることはありません。(鳩の巣の原理による!)このため、Tunakiのソリューションの方が優れています。
Lii

@Lii それぞれに値がないのはなぜですか?
Kartik Chugh

1
@ K_7:たとえば、0.0と1.0の間に10,000の異なるdouble値があるとしましょう(実際にはそれ以上あるでしょう)。間の範囲ならrangeMinとはrangeMax大きく、その後、それらの間の10,000,000の異なる二重の値があるかもしれません。の結果は(rangeMax - rangeMin) * r.nextDouble()、これらの可能な10,000,000値のうち10,000の間のみを選択します。(これは完璧な説明ではないようですが、少し役立つかもしれません...)
Lii

1
ああ、なるほど。基本的に、有限の値のセットをとることができる数を乗算しても、そのセットのサイズは変わりません。
Kartik Chugh

138

この質問はJava 7のリリース前に行われましたが、現在、Java 7(およびそれ以降)APIを使用する別の可能な方法があります。

double random = ThreadLocalRandom.current().nextDouble(min, max);

nextDouble最小値(両端を含む)と最大値(両端を含まない)の間の擬似ランダムdouble値を返します。境界は必ずしもそうである必要intはありませんdouble


6
呼び出しにはAPI 21が必要
Zar E Ahmer

2
@XarEAhmer API 21とは?
Abhijit Sarkar

彼はAndroidについて言及しているようです。
Kartik Chugh

40

これを使って:

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

編集:

new Random().nextDouble():0から1の間の数値をランダムに生成します

start:開始番号、番号を「右」にシフトします

end - start:間隔。ランダムは0から1までの数を与えるため、ランダムはこの数の0%から100%までを与えます。


編集2: Tks @danielおよび@aaa bbb。私の最初の答えは間違っていました。


4
import java.util.Random;

public class MyClass {
     public static void main(String args[]) {
          Double min = 0.0;  // Set To Your Desired Min Value
          Double max = 10.0; // Set To Your Desired Max Value
          double x = (Math.random() * ((max - min) + 1)) + min;   // This Will Create A Random Number Inbetween Your Min And Max.
          double xrounded = Math.round(x * 100.0) / 100.0;   // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
          System.out.println(xrounded);    // This Will Now Print Out The Rounded, Random Number.
     }
}

0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

ランダムの主な考え方は、擬似ランダム値を返すということです。完全にランダムな関数などは存在しないため、同じシードを使用する2つのランダムインスタンスは、特定の条件で同じ値を返します。

それを理解するために、最初に関数ドキュメントを表示することをお勧めしますhttps://docs.oracle.com/javase/8/docs/api/java/util/Random.html

関数nextDouble()の戻り値が0.0と1.0の間の疑似ランダム値であることを理解したので、これを有利に使用できます。

境界が有効(A> B)であるAとBの間の乱数を作成するには、次のことを行う必要があります。1. AとBの間の範囲を見つけて、「ステップ」の数を知ることができるようにします。2. random関数を使用して、実行するステップの数を決定します(戻り値は0.0から1.0の間であるため、「ランダムに増加する割合を選択する」と考えることができます。3.オフセットを追加します

結局、私の意見では、暴徒があなたにそうする最も簡単で最も一般的な方法を与えたことがわかります

double randomValue = rangeMin +(rangeMax-rangeMin)* r.nextDouble();

double RandomValue = Offset +(Range)*(0.0-1.0の間のrandomVal)

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