假设我想用蒙特卡洛模拟作为练习来计算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
?例如,由于试验次数众多,是否值得使用
view
或iterator
代替Range(1, trials)
和reduce
代替map
和sum
?
最佳答案
基于流的版本,另一个替代方案。我认为这很清楚。
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/