我没有投反对票,但如果没有更多细节,很难回答你的问题。
在 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
,一旦生成了随机数列表,您将在列表元素上统一应用多个函数。出于并行性目的,我建议您使用 Array 而不是 List,这样可以提供更好的加速。数组允许对元素进行随机访问,因此不同的线程可以轻松地并行访问数组的不相交部分。尽管数组是可变的,但由于高阶函数和数组理解,您可以以无副作用的方式使用它们。
为了使每个元素的任务有意义,您应该将一系列合并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() } ]
你可以对classes做类似的事情。