Scala中Pi的蒙特卡罗计算
发布时间:2020-12-16 09:25:16 所属栏目:安全 来源:网络整理
导读:假设我想用蒙特卡罗模拟计算Pi作为练习. 我正在编写一个函数,它随机选取一个方形(0,1),(1,0)中的一个点并测试该点是否在圆内. import scala.math._import scala.util.Randomdef circleTest() = { val (x,y) = (Random.nextDouble,Random.nextDouble) sqrt(x*
假设我想用蒙特卡罗模拟计算Pi作为练习.
我正在编写一个函数,它随机选取一个方形(0,1),(1,0)中的一个点并测试该点是否在圆内. import scala.math._ import scala.util.Random def circleTest() = { val (x,y) = (Random.nextDouble,Random.nextDouble) sqrt(x*x + y*y) <= 1 } 然后我正在编写一个函数,它将测试函数和试验次数作为参数,并返回测试结果为真的试验部分. def monteCarlo(trials: Int,test: () => Boolean) = (1 to trials).map(_ => if (test()) 1 else 0).sum * 1.0 / trials ……我可以计算Pi monteCarlo(100000,circleTest) * 4 现在我想知道是否可以改进monteCarlo功能.你怎么写monteCarlo高效可读? 例如,由于试验的数量很大,是否值得使用视图或迭代器而不是Range(1,试验)并减少而不是map和sum? 解决方法
基于流的版本,另一种选择.我认为这很清楚.
def monteCarlo(trials: Int,test: () => Boolean) = Stream .continually(if (test()) 1.0 else 0.0) .take(trials) .sum / trials (总和不是专门用于流,但实现(在TraversableOnce中)只调用专门的foldLeft并“允许GC沿途收集.”因此.sum不会强制对流进行评估,因此赢得了’ t立即将所有试验保存在记忆中) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |