scala - Scala中Pi的蒙特卡洛计算

标签 scala montecarlo

假设我想用蒙特卡洛模拟作为练习来计算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

例如,由于试验次数众多,是否值得使用viewiterator代替Range(1, trials)reduce代替mapsum

最佳答案

基于流的版本,另一个替代方案。我认为这很清楚。

def monteCarlo(trials: Int, test: () => Boolean) =
    Stream
      .continually(if (test()) 1.0 else 0.0)
      .take(trials)
      .sum / trials

(sum不是专门用于流的,但是实现(在TraversableOnce中)只是调用专门的foldLeft并“允许GC沿途收集。”因此,.sum不会强制对流进行求值,因此也不会。一次将所有试验都保存在内存中)

关于scala - Scala中Pi的蒙特卡洛计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647407/

相关文章:

Scala 避免返回,同时仍然缩短迭代

arrays - 在 Scala 中做不可变字节数组的最有效方法是什么?

python - 在 Python 中将一长串洗牌次数甚至更长

c - C错误输出中高斯函数f(x)= exp(-x ^ 2/2)的蒙特卡洛积分

python - 随机游走 - 并行处理

r - 二元和连续变量的 Copula 和模拟

python - 如何在Python中使用蒙特卡罗方法求球体的体积?

scala - Cats Free 基于 Monad 的代数组合

scala - 使用 Fold 将 List[JsObject] 转换为 JsArray

eclipse - 在 Scala 2.11 中使用 util.parsing