加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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立即将所有试验保存在记忆中)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读