2012-03-15 22 views
9

で一定の範囲のランダムな二重の数を生成しますJavaの範囲(-1554900.101)から(52952058699.3098)までの乱数を生成し、本当に理解したいと思っている人は誰でも私に説明することができますか?は、私はかなりこの問題を説明したが、それらはすべて使用される整数値と、私は正直に完全ので、この質問を、それを理解していない記事を見てきたJava

私の考え: これは正しいアプローチですか? 1)指定された範囲内にランダムな整数を生成する 2)生成された数値をpiで除算してfloat/double randomの結果を得ます。

ありがとうございます。

+1

私は本当にその正確な制限の背後にある理由を知りたいです。 – adelphus

+0

Java 7では、ここではもっと簡単な答えがありますhttp://stackoverflow.com/a/32808589/1743880 – Tunaki

答えて

34

ここにその考えがあります。 の範囲の乱数を、たとえば[-1.1,2.2]としましょう。簡単な例から始めましょう。その範囲は2.2 - (-1.1) = 3.3から3.3までです。今では、ほとんどの "ランダム"関数は、[0,1)の長さを持つ数値を返します。スケール私たちの希望する範囲に私たちの乱数。

Random random = new Random(); 
double rand = random.nextDouble(); 
double scaled = rand * 3.3; 

今私達の乱数は、私たちが望む大きさを持っているが、我々は我々が望む正確な値の間になるように数直線でそれをシフトする必要があります。このステップでは、範囲全体の下限をスケールされた乱数に追加するだけで済みます。

double shifted = scaled + (-1.1); 

だから今我々は、単一の機能で一緒にこれらの部品を置くことができます。もちろん

protected static Random random = new Random(); 
public static double randomInRange(double min, double max) { 
    double range = max - min; 
    double scaled = random.nextDouble() * range; 
    double shifted = scaled + min; 
    return shifted; // == (rand.nextDouble() * (max-min)) + min; 
} 

を、この機能はNaNのような予期しない値をチェックするいくつかのエラーを必要とするが、この答えは、一般的な考え方を説明する必要があります。

+0

私は 'Double.MAX_VALUE'と' Double.MIN_VALUE'を使っていて、あなたの最後のスニペットは範囲外に出ますか? – SOFe

7
double lower = -1554900.101; 
double upper = 52952058699.3098; 
double result = Math.random() * (upper - lower) + lower; 
+0

しかし、OPは、 'int'から' double '型への変換ではなく、* explanation *を探しています... – maerics

2

それはのようなものでなければなりません:

double rnd = Math.random(); 

double result = ((long)(rnd * (529520586993098L - (-15549001010L) + 1)) -15549001010L)/10000.0; 

+ 1は範囲がそのように上限が[0;1[除外されているという事実のためにバランスされます。

私たちは、最初の「整数」(本当に長い)範囲を見つけようと、私たちはそう529520586993098L + 15549001010L + 1、最後の番号が除外されているという事実のバランスを取るために1を追加し、その後、我々はrndを掛け、longにキャストし、15549001010Lを引きますそれを元に戻し、最後に10000.0で割り、右の「範囲」にします。

これはおそらく、より明確である:

long range = 529520586993098L + 15549001010L + 1; 

double temp = rnd * range; 
long temp2 = (long)temp; 
temp2 -= 15549001010L; 

double result = temp2/10000.0; 
2

これではない、私はそれを行うだろうか。

  • ランダムなダブルを生成します。結果は、乗算
  • 0と1の間(HighLimitで - LowLimitの)によって、この数れる(52952058699.3098 - -1554900.101)
  • はここに行くLowLimitの(-1554900.101 +ランダム)

を追加します。上限と下限の間に乱数があります。

1

Random.nextDouble範囲[二重を返す0、1 [ので、あなたの範囲のサイズ(52952058699.3098 + 1554900.101)と乗算し、それを使用し、電話番号を取得する(1554900.101を減算)結果をオフセット。

これ以上の分析は必要ありませんが、さらに分析することなく、ダブルスの処理方法によって範囲外の数値が得られる可能性があります。

関連する問題