Search code examples
scalafor-loopmismatch

Scala Mismatch MonteCarlo


I try to implement a version of the Monte Carlo algorithm in Scala but i have a little problem. In my first loop, i have a mismatch with Unit and Int, but I didn't know how to slove this.

Thank for your help !

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)
}

A guy working usually with Python.


Solution

  • for loop does not return anything, so that's why your method returns Unit but expects List[Int] as return type is List[Int]. Second, you have not used scala interpolation correctly. It won't print the value of error. You forgot to use 's' before the string. Third thing, if want to return list, you first need a list where you will accumulate all values of every iteration. So i am assuming that you are trying to return error for all iterations. So i have created an errorList, which will store all values of error. If you want to return something else you can modify your code accordingly.

    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)