不匹配的蒙特卡洛尺度
Scala Mismatch MonteCarlo
我尝试在 Scala 中实现 Monte Carlo 算法的一个版本,但我遇到了一个小问题。
在我的第一个循环中,我与 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
循环不会 return 任何东西,所以这就是为什么你的方法 returns Unit
但期望 List[Int]
为 return 类型是 List[Int]
。
其次,您没有正确使用 scala 插值。它不会打印错误的值。您忘记在字符串前使用 's' 。
第三件事,如果想要 return 列表,您首先需要一个列表,您将在其中累积每次迭代的所有值。
所以我假设您正在尝试 return 所有迭代的错误。所以我创建了一个 errorList,它将存储所有错误值。如果您想 return 其他内容,您可以相应地修改您的代码。
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)
我尝试在 Scala 中实现 Monte Carlo 算法的一个版本,但我遇到了一个小问题。 在我的第一个循环中,我与 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
循环不会 return 任何东西,所以这就是为什么你的方法 returns Unit
但期望 List[Int]
为 return 类型是 List[Int]
。
其次,您没有正确使用 scala 插值。它不会打印错误的值。您忘记在字符串前使用 's' 。
第三件事,如果想要 return 列表,您首先需要一个列表,您将在其中累积每次迭代的所有值。
所以我假设您正在尝试 return 所有迭代的错误。所以我创建了一个 errorList,它将存储所有错误值。如果您想 return 其他内容,您可以相应地修改您的代码。
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)