处理布丰针模拟
Processing Buffon's Needle Simulation
大家好,我们今天开始在我的计算机中编写 Buffons 针模拟代码 class。我的老师向我们展示了以下代码,但无法解释为什么模拟没有获得准确的近似值。有很多噪音,近似值在 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);
}
}
我 运行 代码,在删除字体、更改颜色(供我使用)并将 intersects
和 numTrials
更改为 float
类型后,它收敛良好,似乎按预期工作。也许您没有 运行 通过足够的试验,这导致您的 PI 估计值不合理地波动(您可以在我的 运行-through 的早期试验中看到这种情况,如下面屏幕截图中的线条所示).
我将 frameRate(600)
添加到 运行 模拟速度提高了 10 倍。
选择数字18似乎是为了在舞台底部和画线的位置之间提供合理的边界。更改此数字将影响红线所在的 y 坐标以及近似线收敛的位置。
大家好,我们今天开始在我的计算机中编写 Buffons 针模拟代码 class。我的老师向我们展示了以下代码,但无法解释为什么模拟没有获得准确的近似值。有很多噪音,近似值在 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);
}
}
我 运行 代码,在删除字体、更改颜色(供我使用)并将 intersects
和 numTrials
更改为 float
类型后,它收敛良好,似乎按预期工作。也许您没有 运行 通过足够的试验,这导致您的 PI 估计值不合理地波动(您可以在我的 运行-through 的早期试验中看到这种情况,如下面屏幕截图中的线条所示).
我将 frameRate(600)
添加到 运行 模拟速度提高了 10 倍。
选择数字18似乎是为了在舞台底部和画线的位置之间提供合理的边界。更改此数字将影响红线所在的 y 坐标以及近似线收敛的位置。