pi的scala monte carlo estimator(尽可能短)

时间:2015-03-14 15:07:10

标签: scala

每个人都快乐的Pi日!完全没有理由,我正在尝试构建尽可能短的Pi的蒙特卡罗估计。我们可以构建一个可以适合推文的吗?

这就是我拥有的东西

Seq.fill(1000)(Random.nextFloat).zip(Seq.fill(1000)(Random.nextFloat)).map{case (a,b) => a*a + b*b <1}.map(if (_) 1 else 0).reduce(_+_).toFloat / 1000 * 4

因此,这正确地估计了Pi,但是大约15个字符太长,不适合推文。我们可以做得更好吗?显而易见的问题(对我而言)是产生随机数Seq.fill(1000)(Random.nextFloat)的冗长,任何巧妙的方法都可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

一种可能的较短解决方案(70个字符,没有不必要的空格)。

def r = math.random; Seq.fill(1000)(r,r).count{case (a,b) ⇒ a*a + b*b < 1} / 250d

要将此响应保留在StackOverflow的范围内,以下是一些有用的Scala功能:

  • 使用math.random生成随机双数字;
  • (r,r)代码段使用Scala automatic tupling;
  • count()方法;
  • 使用unicode符号作为右双箭头;
  • d中的250d将创建一个Double而不是Int。