斯卡拉错配蒙特卡洛



我尝试在 Scala 中实现蒙特卡洛算法的一个版本,但我有一点问题。在我的第一个循环中,我与 Unit 和 Int 不匹配,但我不知道如何区分这一点。

感谢您的帮助!

import scala.math._
import scala.util.Random
import scala.collection.mutable.ListBuffer
object Main extends App{
  def MonteCarlo(list: ListBuffer[Int]): List[Int] = {
    for (i <- list) {
      var c = 0.00
      val X = new Random
      val Y = new Random
      for (j <- 0 until i) {
        val x = X.nextDouble // in [0,1]
        val y = Y.nextDouble // in [0,1]
        if (x * x + y * y < 1) {
          c = c + 1
        }
      }
      c = c * 4
      var p = c / i
      var error = abs(Pi-p)
      print("Approximative value of pi : $p tError: $error")
    }
  }

  var liste = ListBuffer (200, 2000, 4000)
  MonteCarlo(liste)
}

一个通常与Python一起工作的人。

for循环不返回任何内容,因此这就是为什么您的方法返回Unit但期望List[Int],因为返回类型是List[Int]。其次,您没有正确使用标塔插值。它不会打印错误值。您忘记在字符串前使用"s"。第三件事,如果要返回列表,首先需要一个列表,您将在其中累积每次迭代的所有值。所以我假设您正在尝试为所有迭代返回错误。所以我创建了一个错误列表,它将存储所有错误值。如果你想返回其他东西,你可以相应地修改你的代码。

def MonteCarlo(list: ListBuffer[Int]) = {
   val errorList = new ListBuffer[Double]()
for (i <- list) {
      var c = 0.00
      val X = new Random
      val Y = new Random
      for (j <- 0 until i) {
        val x = X.nextDouble // in [0,1]
        val y = Y.nextDouble // in [0,1]
        if (x * x + y * y < 1) {
          c = c + 1
        }
      }
      c = c * 4
      var p = c / i
     var error = abs(Pi-p)
     errorList += error
      println(s"Approximative value of pi : $p tError: $error")
  }
 errorList
}
scala> MonteCarlo(liste)
Approximative value of pi : 3.26    Error: 0.11840734641020667
Approximative value of pi : 3.12    Error: 0.02159265358979301
Approximative value of pi : 3.142   Error: 4.073464102067881E-4
res9: scala.collection.mutable.ListBuffer[Double] = ListBuffer(0.11840734641020667, 0.02159265358979301, 4.073464102067881E-4)

相关内容

  • 没有找到相关文章

最新更新