私は反対票を投じませんでしたが、詳細なしにあなたの質問に答えることは困難でした。
F#では、不変リストが最も頻繁に使用されるデータ構造です。多くの場合、consコンストラクター(::)
と空のリストを使用してリストを作成します[]
。たとえば[1; 2; 3]
、はの構文糖衣です1::2::3::[]
。@Brianが提案したリンクをたどると、基本的なリスト処理の詳細を読むことができます。
F#リストに慣れたら、高階関数とリスト内包表記を使用して新しいリストを作成できます。あなたの場合、乱数のリストは次のように生成できます。
let genRand =
let rand = System.Random()
fun () -> rand.NextDouble()
/// Creating a list using high-order functions
let genRandList n = List.init n (fun _ -> genRand())
/// Creating a list using list comprehension
let genRandList' n = [ for i in 1..n -> genRand() ]
私はモンテカルロシミュレーションに精通していません。ただし、この記事を読むList.map
と、乱数のリストが生成されたら、リスト要素にいくつかの関数を均一に適用できます。並列処理の目的で、Listの代わりにArrayを使用することをお勧めします。これにより、はるかに高速化されます。配列は要素へのランダムアクセスを可能にするため、異なるスレッドが配列の互いに素な部分に並列に簡単にアクセスできます。配列は変更可能ですが、高階関数と配列の理解により、副作用のない方法で使用できます。
各要素でのタスクが重要であるためには、一連のタスクを1つにマージし、並列処理のためににArray.map
変更Array.map
する必要があります。関数Array.Parallel.map
を並列化することもできます。mean
ただし、スピードアップが得られる可能性はほとんどありません。このスニペットを見て、アレイを使用したソリューションがどのように見えるかを確認してください。
更新:
レコードのリストを作成します。
type RandPair = { First: float; Second: float}
let genRandPairs n = [ for i in 1..n ->
{ First = genRand(); Second = genRand() } ]
クラスについても同様に行うことができます。