2017-11-19 10 views
0

私はScalaでMonte Carloアルゴリズムのバージョンを実装しようとしていますが、少し問題があります。 私の最初のループでは、UnitとIntのミスマッチがありますが、これをどうやってスービングするのか分かりませんでした。Scala Mismatch 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]を期待理由です。 第2に、スカラ補間を正しく使用していません。エラーの値は表示されません。文字列の前に 's'を使うのを忘れた。 3つ目のことは、リストを返す場合は、まずすべての反復のすべての値を累積するリストが必要です。 私はあなたがすべての反復でエラーを返そうとしていると仮定しています。だから、エラーのすべての値を格納する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) 
関連する問題