2017-11-19 10 views
0

스칼라에서 몬테카를로 알고리즘의 버전을 구현하려고하지만 약간 문제가 있습니다. 첫 번째 루프에서는 Unit 및 Int와의 불일치가 있지만이 문제를 해결하는 방법을 알지 못했습니다.스칼라 불일치 MonteCarlo

도움 주셔서 감사합니다.

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을 사용하는 사람.

답변

1

for 루프는 아무 것도 반환하지 않습니다, 그래서 당신의 방법은 Unit을 반환하지만 반환 형식이 List[Int] 같이 List[Int]을 기대하는 이유입니다. 둘째, 스칼라 보간을 올바르게 사용하지 않았습니다. 오류 값을 인쇄하지 않습니다. 문자열 앞에 's'을 사용하는 것을 잊었습니다. 셋째, 목록을 반환하려면 모든 반복의 모든 값을 누적하는 목록이 필요합니다. 그래서 모든 반복에 대해 오류를 반환하려고한다고 가정합니다. 그래서 오류의 모든 값을 저장합니다 errorList를 만들었습니다. 다른 것을 반환하려면 코드를 적절하게 수정할 수 있습니다.

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)