2017-11-28 9 views
1

Java 8には、ストリームで使用すると思われるSplittableRandomという乱数生成器が追加されました。しかし、それがどのようにしてThreadLocalRandomより優れているか、より有用であるかは不明です。ドキュメントを読むことから、より良い統計的性質を持つようにアルゴリズムが変更されたようです。それは、なぜそれをBetterThreadLocalRandomと呼び、スプリットメソッドをドロップしないのですか?誰も今までにsplit()と電話をかけますか?SplittableRandomのポイントは何ですか?

+0

'BetterThreadLocalRandom' lol –

+0

' ThreadLocalRandom'の置き換えではないことを考慮すると、 'BetterThreadLocalRandom'のようなものを呼び出すと誤解を招きます。それはスレッドローカルでさえありません。 – user2357112

+0

私はさらに良いクラスを持っていて、私はそれを 'TheBestEverThreadLocalRandom'と呼んでいます –

答えて

1

SplittableRandomの有用性は、決定論的な乱数生成器から来ています。ストリームの場合、異なるスレッドが異なるThreadLocalRandomの値を使用する可能性があり、毎回異なる計算が行われます。 Doug Lea渡しでこれを言及クラスを導入しながら:

「ThreadLocalRandomオプションは、多くの目的のために素晴らしいですが、あなたは、たとえば、中、高品質なモンテカルロ・シミュレーションを、それを使用したいとは思わないでしょう。」

シミュレーションに興味深い結果があり、特定の乱数シーケンスに依存している場合は、さらに分析するために繰り返してみましょう。

0

異なる状況で使用される2つの異なるものを比較しています。 1つは、ある程度まで他の役割を果たすことができます。

ThreadLocalRandomは、再帰的に分割して新たなSplittableRandomを提供することができるのでSplittableRandomは、発電機および発電機の発電もあり、ローカルスレッドごとに異なる乱数生成器のちょうど例です。

しかし、SplittableRandomは、機能環境のストリームと連携できるものを提供するためのものなので、スレッドとは関係ありません。

ランダムなデータを提供することは、スレッドに依存しないでください。parallel()をストリームで使用しても、スレッドには依存しません。私はストリームを処理しているラムダの中で自分自身がThreadLocalRandom.current()をやっているのを見たくないでしょうか?

さらに、パラレルストリームを処理するためにスリープ/スリープ解除スレッドの固定サイズのプールを使用する実装では、複数のエントリに対して同じThreadLocalRandomが使用されます。SplittableRandomが可能な並列パスにバインドされている特定のスレッドではなく、処理の対象となります。

+0

はい私はストリームでThreadLocalRandomを使用しますが、なぜそうではありませんか?もちろん、インスタンスそのものを渡すことはありませんが、その呼び出しを行う際に何か問題がありますか? –

+0

@CarlMastrangelo:特定のエントリのストリームで使用されているラムダを実行しているスレッドが分からないため、スレッドが1つしかない場合はどうなりますか?一定量のスレッドをお持ちの場合はどうなりますか? 'SplittableRandom'は、無限のランダム産卵機構を提供します。これは、私が機能環境で期待しているものです。 – Jack

+0

スレッドの数は何故問題になるのですか?スレッドが1つしかない場合、TLR.current()。next()への各呼び出しは、予測不可能な数値を返します。 SplittableRandomは何を提供できますか?私は、TLRを使用するコードが間違っていることを期待していました。 –

関連する問題