以下代码是Buffon针刺实验的一个例子吗?

时间:2015-07-19 19:16:44

标签: java algorithm

import java.util.Random;

public class Test {
    public static void main(String[] args) {
        double sum = 0;
        double sum2 = 0;
        Random randomNum = new Random();
        for(int i = 0; i<10000; i++) {
            int random = randomNum.nextInt(5);
            if (random == 1 || random == 3 || random==5) {
                sum++;
            }
            else {
                sum2++;
            }
        }
        System.out.println(2*(sum2)/sum);
    }
}

这个程序非常自我解释。每次for循环运行时,我都会创建一个随机数。然后我让程序找到数字是否等于1,3或5,并且从中得到数学。

如果这不是一个有效的实验,有人可以帮我创建吗?

2 个答案:

答案 0 :(得分:1)

此代码确实无法模拟Buffon's needle experiment。以下是证据:

  • a)使用nextInt(int bound),您会根据uniform distributionint(包含)和0(不包括)之间生成随机boundbound = 5的可能结果为{0, 1, 2, 3, 4}
  • b)由于我们使用统一分布,因此每个结果与Pr(x = 0) = Pr(x = 1) = Pr(x = 2) = Pr(x = 3) = Pr(x = 4) = 1 / 5的概率相同。
  • c)x = 1x = 3的事件是互斥的,因此Pr(x = 1 ∪ x = 3) = Pr(x = 1) + Pr(x = 3) = 1 / 5 + 1 / 5 = 2 / 5
  • d)使用c),我们可以推断E(sum)等于10000 * P(x = 1 ∪ x = 3) = 10000 * 2 / 5 = 4000。同样,人们可以证明E(sum2) = 6000
  • e)使用上述信息,可以看到E(2 * sum2 / sum) = 3不等于Pi = 3.14159...

如维基页面所述,您需要两个独立的随机变量用于布冯的针实验:一个用于位置,另一个用于角度。我担心你必须重新设计你的算法。

答案 1 :(得分:0)

没有。这不是&#34;布冯的针&#34; - 实验。此代码只检查给定范围内的随机数是否为偶数。布冯的针包括两个值:针的每个末端的坐标。并且结果不是针是否在给定范围内,而是它是否从一组线中穿过一条线,或者它是否没有。 Buffon针的实现需要生成两个随机值:针的一端的x位置和它的方向。根据这两个值,算法可以确定针是否穿过一条线或不是。

define createAndCheckNeedle:
    input: double[] linesX , double len
    output: bool

    //the position of x must lie in the range of floor-width
    double x = randomDouble(0 , linesX[length(linesX) - 1])
    //the orientation of the needle as rad
    double orientation = randomDouble(0 , PI * 2)

    //the position of the other orientation
    double x2 = x + cos(orientation) * len

    return contains(linesX , l -> min(x , x2) < l AND max(x , x2) > l