使用Clojure编程蒙特卡罗模拟

时间:2016-04-12 11:35:10

标签: clojure lisp

用于估计π值的蒙特卡罗方法使用随机数发生器来模拟飞镖投掷到飞镖板上。在这个程序中,您将模拟大量的飞镖投掷,并通过几何概率,根据您的实证结果估计π的值。 假设我们绘制一个半径为1的圆,中心位于原点(0,0)。该圈的四分之一位于   笛卡尔坐标平面的第一象限,其中x和y坐标都是非负的。该 我们圆的面积是πr2=π·(1)2 =π,所以第一象限中圆的四分之一面积 是π。我们将在这个四分之一圆圈投掷飞镖,为每个飞镖随机生成两个坐标 区间[0,1];飞镖可能落地的区域形成边长1和总面积1的正方形。飞镖落入四分之一圆的概率是通过划分目标区域的面积(π)得到的 4 在可能的着陆区域(1)的区域。如果我们在我们的电路板上投掷大量飞镖并计算在四分之一圆内的数量,我们可以估计π的值,从而也可以估算π。 (假设 4 当然,我们的随机数生成器是真正随机的。)

您将通过实施以下功能在Clojure中编写蒙特卡罗模拟:

  1. coord - 不接受任何参数,并返回在[0,1]区间内随机生成的两个坐标的列表。请参阅rand和list。

  2. throw-darts - 使用一个参数n表示要投掷多少个飞镖,然后生成一个长度为n的坐标列表。反复使用以生成一连串的坐标调用;使用取结果来获取前n个结果。

  3. 时,命中? - 获取包含一个飞镖坐标的列表,并返回该镖是否落入我们的四分之一圆内。提示:计算从原点到飞镖坐标的距离,并确定该距离是指落入四分之一圆内外的飞镖。

  4. 我回答了第一个问题:

    (defun coord () (let ((lst ()))
    (dotimes (i 2)
    (setf lst (cons (random 2) lst)))
    lst))
    

    但需要另外两人的帮助。

1 个答案:

答案 0 :(得分:4)

<强>注释

这看起来像家庭作业,所以我只是添加提示,假设你在Clojure工作。

  1. Clojure有矢量文字,例如[1 2 "Buckle my shoe"], 比列表更容易使用。
  2. 使用repeatedly生成一系列调用 (副作用)功能。您想要的功能是rand
  3. 您只需要求坐标的平方和。这给了 距离的平方,只有当距离是这样时才<= 1。
  4. 您的最终功能应该filter点击并count。它与总数的比例估计为pi / 4.您应该将其从理性转换为double