使用 Clojure 编写 Monte carlo 模拟程序

Programming a Monte carlo simulation using Clojure

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

您将通过实现以下函数在 Clojure 中编写 Monte Carlo 模拟程序:

  1. coord - 不带任何参数,returns 是 [0, 1] 区间内两个随机生成的坐标的列表。参见 rand 和 list。

  2. throw-darts - 采用单个参数 n 表示要投掷多少飞镖,然后生成长度为 n 的坐标列表。重复使用以生成无限序列的坐标调用;使用 take on the result 取前 n 个结果。

  3. 被击中? - 获取一个列表,其中包含一个飞镖的坐标和 returns 该飞镖是否落在我们的四分之一圆内。提示:计算从原点到飞镖坐标的距离,并确定该距离是否意味着飞镖落在四分之一圆的内部或外部。

我回答了第一个问题:

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

但需要另外两个人的帮助。

评论

这看起来像是家庭作业,所以我将添加一些提示,假设您正在使用 Clojure。

  1. Clojure 有矢量文字,例如 [1 2 "Buckle my shoe"], 比列表更容易使用。
  2. 使用 repeatedly 生成对 a 的调用序列 (副作用)功能。你想要的函数是rand
  3. 您只需对坐标的平方求和即可。这给出了 距离的平方,只有当距离是这样时才 <= 1。

您的最终函数应该 filter 命中和 count 它们。这个占总数的比例估计是 pi / 4。你应该把它从有理数转换成 double