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,并且从中得到数学。
如果这不是一个有效的实验,有人可以帮我创建吗?
答案 0 :(得分:1)
此代码确实无法模拟Buffon's needle experiment。以下是证据:
nextInt(int bound)
,您会根据uniform distribution在int
(包含)和0
(不包括)之间生成随机bound
。 bound = 5
的可能结果为{0, 1, 2, 3, 4}
。Pr(x = 0) = Pr(x = 1) = Pr(x = 2) = Pr(x = 3) = Pr(x = 4) = 1 / 5
的概率相同。x = 1
和x = 3
的事件是互斥的,因此Pr(x = 1 ∪ x = 3) = Pr(x = 1) + Pr(x = 3) = 1 / 5 + 1 / 5 = 2 / 5
E(sum)
等于10000 * P(x = 1 ∪ x = 3) = 10000 * 2 / 5 = 4000
。同样,人们可以证明E(sum2) = 6000
。 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