私は、スレッド化と並行性に関してかなり不慣れです。これを改善するために、私は現在、F#でランダム検索アルゴリズムを実装するのに面白い作業をしています。私はSystem.Randomクラスのラッパーを作成しました。既存のC#のアイデアに従っていますが、どうやって単体テストを始めるのか分からないので、経験豊かな人たちが何を言いたいのか聞いてみたいこれは適切なスレッドセーフなランダムラッパーですか?
open System
open System.Threading
type Probability() =
static let seedGenerator = new Random()
let localGenerator =
new ThreadLocal<Random>(
fun _ ->
lock seedGenerator (
fun _ ->
let seed = seedGenerator.Next()
new Random(seed)))
member this.Draw() =
localGenerator.Value.NextDouble()
これが何をするかの私の理解::、およびF#構文に起因するか、誤解をスレッドのいずれかの私のコードで明らかに傷や改善点がある場合にThreadLocalは、例えば、各スレッドは独自のインスタンスを確実に受け取ることができますランダム、一般的な静的ランダムによって提供されるランダムなシードを持ちます。こうすることで、クラスのインスタンスが複数作成されても、それらのインスタンスが独自のシードを受け取り、「重複した」ランダムシーケンスの問題を回避できます。ロックによって、2つのスレッドが同じシードを取得することはありません。
この見た目は正しいですか?明らかな問題はありますか?
すぐに連続していくつかのオブジェクトを生成する場合、このようなコードの問題があります。それらのすべてが同じ種を持つからです。あるいは、それらがグローバルであることを意味しましたか? – svick
@svick - Pointはランダムなスタック全体を生成する理由でした - これは複数のスレッドからアクセスできる単なるランダムなものです。はるかに簡単で、乱数の数が必要ない限り、それはうまくいくはずです。もし、ランドがボトルネックであれば、別のジェネレータを使って速度を上げるほうがよいでしょう。 –
高価なビットはすべての乱数のロックです。 –