2016-09-13 4 views
1

私が作業しているプロジェクトでは、doubleの数値をランダムに生成するか(入力ファイルの内容に応じて)、またはdoublesに変換する必要があります私は自分の入力ファイルからそれらを持っています。これらの数字は、コンマの後に小数点以下2桁(例:0.98)でなければなりません。Javaでランダムな倍精度浮動小数点数を生成する最速の方法

  1. のJava 8の方法:nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(ThreadLocalRandom.current().nextDouble(0,1)).replace(",","."));
  2. 昔ながらの方法:nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(new Random().nextDouble()).replace(",", "."));

漸近的に言えば、これは私は、Java 8で、これを行う2つの方法があることを知っている

最速ですか? ADSの私の貧弱な知識から、私はそれは同じ時間になるでしょうね(O(n)?)私は、別にこれら二つの方法から確認

100%ではないよ0の間でランダムdoublesを生成するための他の方法がありますと1私の提案よりも速く、漸近的に言えば、ですか? (むしろ、O(n)またはO(1)ですべてを行うことができます方法がある?)

は、として文字列を使用する鉱山

+0

は 'Math.random()' – Bene

+0

が速くランダム()。nextDouble()またはThreadLocalRandom.current.nextDouble()よりも、それはありますか? –

+1

O(n) – xenteros

答えて

8

のこの質問へのあなたのアプローチの両方に答えるために分を過ごすことになります皆様に事前にありがとうこれは非常に非効率的です(メモリ割り当て、文字列解析、文字列書式設定はすべて比較的遅い操作です)。

10進数が2桁だけ必要な場合、 0..99の範囲の整数を作成し、100.0で割りますか?

Random random = new Random(); // Only one instance needed. 
for (int n = 0; n < total; n++) { 
    double nthRandomNumber = random.nextInt(100) / 100.0; 
} 
+0

あなたは絶対に正しいです。Stefan、私は乱数を生成するこのアプローチについて考えたことはありません!私は入力ファイルから必要な値を得ることがあるので、複雑なことをすべてやっています –

+0

数字の精度(重要度)が重要な場合、Doubleを使用することはお勧めしていないと思いませんか? –

+0

@PiotrRこのプロジェクトは私にDoublesとの連携を強いるので、Floatを使うことはできません –

1

コードが複雑に見えます。

DecimalFormat decimalFormat = new DecimalFormat("0.00"); 
String twoDigitRandom = decimalFormat.format(Math.random()); 

参考:

あなたは以下の点を考慮しました https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random()

以上0.0および1.0未満に等しい正の符号の付いたdouble値を返します。

編集:コメントの後に追加されました:

あなたは桁数を制御し、最終的な結果として文字列を持っていない希望の場合は、その後、私はダブルを使用しないように助言する、代わりのBigDecimalを試してみてください。どの程度

MathContext m = new MathContext(3); 
BigDecimal randomWithTwoDigits = new BigDecimal(Math.random(), m); 
+0

私は二重を必要とします。そのため、私は複雑なものとparseDoubleをすべて実行しています。 –

+0

もう一つのオプションを追加しました。 BigDecimalは、桁数を制御したい場合は、より自然です。 –

関連する問題