Graph 处理Buffon';s针模拟

Graph 处理Buffon';s针模拟,graph,processing,simulation,approximation,Graph,Processing,Simulation,Approximation,嘿,伙计们,我们今天开始在我的计算课上编写Buffons针模拟。我的老师给我们看了下面的代码,但无法解释为什么模拟没有得到精确的近似值。存在大量噪声,近似值在3.6到2.8之间变化很大。我觉得有些东西有缺陷,但我就是看不出是哪一部分。另外,我不理解程序的最后一部分(如何在图表上绘制点)。18岁从哪里来 如果你有空余时间,我会很感激你的回答,因为我现在正在努力计算。提前感谢您的回答 //set up and define all the variables that we will use int

嘿,伙计们,我们今天开始在我的计算课上编写Buffons针模拟。我的老师给我们看了下面的代码,但无法解释为什么模拟没有得到精确的近似值。存在大量噪声,近似值在3.6到2.8之间变化很大。我觉得有些东西有缺陷,但我就是看不出是哪一部分。另外,我不理解程序的最后一部分(如何在图表上绘制点)。18岁从哪里来

如果你有空余时间,我会很感激你的回答,因为我现在正在努力计算。提前感谢您的回答

//set up and define all the variables that we will use
int numTrials = 0;
int intersects = 0;
int lineWidth = 30;
int needleWidth = 0.5*lineWidth;
int boardHeight;
float piApprox;
final float PI = 3.14159265359;

//Defines our initial enviroment properties and creates our grid
void setup(){
  size(600,800);
  background(255);
  stroke(0);
  boardHeight = int (height - 200);
  for (int i = 0; i<=width; i+=lineWidth){ 
    line(i,0,i,boardHeight);
  }
}

//Continously executes the same command
void draw(){
  //generates a random x and y co-ordinate. This becomes the first point
    int a = round(random(width));
  int b = round(random(boardHeight));
  float theta = random(PI);
  //Generates a random x and y co-ordinate which is one needlelength away from first point. This becomes the second point
    int c = round(needleWidth*cos(theta)+a);
  int d = round(needleWidth*sin(theta)+b);
  numTrials++;

  //checks for intersections
  boolean touching = false;
  for (int i = 0; i<=width; i+=lineWidth){
    if ((min(a,c) <= i) && (max(a,c) > i)){
      intersects++;
      touching = true;
    }
  }
  //changes colour of line
    if (touching){
    stroke(0,50,155);
  }
  else{
    stroke(0,155,0);
  }
  line(a,b,c,d);
  //Calculates PI and then calls upon the GUI and the graph functions which are updated after every new line)
    piApprox =((numTrials)/( intersects));
  printData();
  graph();
}

void printData(){
  PFont f;
  f = createFont("LetterGothicStd.ttf",32,true);
  textFont(f,12);
  String e = "Number of Trials:" + numTrials + "     ";
  String f = "PI approximation: " + piApprox;
  fill(255);
  stroke(255);
  rect(0,height-20,400,20);
  fill(0);
  text(e,3,height-8);
  text(f,150,height-8);
}

void graph(){
  //draw PI line
  int piLine = height - 20 - round(18 * PI);
  stroke(255,0,0);
  line(0,piLine,width,piLine);

    //Speed determines how often a point is drawn
  int speed = 5;
  //Clears graph when it reaches the end of the screen
  if (round(numTrials/speed) % width == 0){
    fill(255);
    stroke(255);
    rect(0,boardHeight,width,180);
  }

  //plots points
  if(numTrials % speed == 0){
    int pointW = round(numTrials/speed) % width;
        int pointH = height - 20 - round(18 * piApprox);
    stroke(0,55,55);
    point(pointW,pointH);
  }
}
//设置并定义我们将使用的所有变量
int numTrials=0;
int相交=0;
int线宽=30;
int-needleWidth=0.5*线宽;
内板高度;
浮动piApprox;
最终浮点数PI=3.14159265359;
//定义初始环境属性并创建网格
无效设置(){
尺寸(600800);
背景(255);
冲程(0);
boardHeight=int(高度-200);

对于(int i=0;i我运行了代码,在删除字体、更改颜色(供我使用)并将
相交
numTrials
更改为
float
类型后,它收敛良好,似乎能按预期工作。也许您没有进行足够的尝试,这导致您的PI估计值不合理地波动(你可以在我之前的试运行中看到这种情况,如下面截图上的线条所示)

我添加了
帧速率(600)
,以使模拟运行速度加快10倍


选择编号18似乎是为了在舞台底部和画线位置之间提供合理的边界。更改此编号将影响红线所在的y坐标以及近似线收敛的y坐标。

您希望此代码做什么?它做什么相反,您尝试过吗?哪一行代码的行为与您预期的不同?