以下代码是Buffon';什么样的针实验? import java.util.Random; 公开课考试{ 公共静态void main(字符串[]args){ 双和=0; 双sum2=0; 随机数=新随机数(); 对于(int i=0;i

以下代码是Buffon';什么样的针实验? import java.util.Random; 公开课考试{ 公共静态void main(字符串[]args){ 双和=0; 双sum2=0; 随机数=新随机数(); 对于(int i=0;i,java,algorithm,Java,Algorithm,,此代码肯定不会模拟。以下是证明: a) 使用,您可以根据生成介于0(包含)和bound(排除)之间的随机int。使用bound=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=1和x=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)

,此代码肯定不会模拟。以下是证明:

  • a) 使用,您可以根据生成介于
    0
    (包含)和
    bound
    (排除)之间的随机
    int
    。使用
    bound=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=1
    x=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…
如维基页面所述,布冯的针实验需要两个独立的随机变量:一个用于位置,另一个用于角度。我担心你必须重新设计沃勒算法。

不。这不是“布冯的针”-实验。此代码只是检查给定范围内的随机数是否为偶数。布冯的指针由两个值组成:指针两端的坐标。结果不是指针是否位于给定范围内,而是指针是否穿过一组线中的一条线,或者是否穿过。布冯Ne的一个实现edle需要生成两个随机值:针一端的x位置及其方向。根据这两个值,算法可以确定针是否穿过一条线

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);
    }
}
define createandcheckpine:
输入:双[]行X,双透镜
输出:布尔
//x的位置必须位于地板宽度范围内
double x=randouble(0,linesX[长度(linesX)-1])
//针的方向为rad
双方向=随机双方向(0,π*2)
//另一个方向的位置
双x2=x+cos(方向)*透镜
返回包含(linesX,l->min(x,x2)l

性能注意事项:是否有理由在每次迭代中生成一个新的
Random
对象?将此变量从循环中拉出会更有效。是的,不是每次都必须生成一个随机数吗?否则,我们将只使用1个numberNo。
Random randomNum
是随机生成器。calling
nextInt(…)
生成(下一个)随机值。哦,谢谢你会注意到这一点!这里有一个很好的例子。这在java中是什么样子的?@VishvakSeenichamy拜托,这应该不会太难翻译成java,你自己试试。好吧,我明白了,我只是想澄清一下。现在看看代码,我明白了!只是好奇,那是什么语言?@VishvakSeenichamy这是伪代码。它用于显示算法背后的基本思想。这不是可以由软件编译或解释的实际实现“x=1和x=3的事件是独立的”-对不起,什么?它们显然是相互排斥的事件,因此它们在定义上不可能是独立的。此外,您似乎将
|
用作“或”,这至少是误导性的,因为在概率上它被用作“给定”。因此
P(x=1 | x=3)=0
,因为如果
x
3
,那么它就不可能是
1
。我也怀疑用6段来解释,如果你多次从0到4(含)取一个随机数,那么你会有大约2/5个奇数。你是对的。编辑了答案。关于语法……我补充道解释
|
的注释。如果有乳胶风格的符号,我会添加一个
\cup
。但是,对于计算机科学家来说,我认为
|
(逻辑or)表示最接近我所指的语义(出现
x=1\cup x=3
).关于长度:因为这对OP的作者来说并不微不足道,所以我采取了详细解释的方法。让我们看看有人抱怨公式中大写的u(
u)需要多长时间∪,外观[几乎]相同)。=)
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