Hé les gars, nous avons commencé à coder la simulation d'aiguille de Buffons dans ma classe d'informatique aujourd'hui. Mon professeur nous a montré le code suivant mais n'a pas pu expliquer pourquoi la simulation n'obtenait pas d'approximations précises. Il y a beaucoup de bruit et l'approximation varie considérablement entre des valeurs d'environ 3,6 à 2,8. Je pense que quelque chose est défectueux mais je ne peux tout simplement pas voir quelle partie. De plus, je n'ai pas compris la dernière partie du programme (comment tracer les points sur le graphique). D'où vient le 18 ?
Si vous avez du temps libre, j'apprécierais des réponses car j'ai du mal en informatique en ce moment. Merci d'avance pour n'importe quelle réponse.
//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);
}
}
1 réponse
J'ai exécuté le code et après avoir supprimé la police, changé les couleurs (pour mon usage) et changé les types intersects
et numTrials
en float
, il converge bien et semble fonctionner comme prévu. Peut-être que vous n'avez pas effectué suffisamment d'essais et que votre estimation de PI a fluctué de manière déraisonnable (vous pouvez voir cela se produire lors des essais précédents de mon essai, comme indiqué par la ligne sur la capture d'écran ci-dessous).
J'ai ajouté frameRate(600)
pour exécuter la simulation 10 fois plus rapidement.
Le nombre 18 semble être choisi pour fournir une frontière raisonnable entre le bas de la scène et la position à laquelle la ligne est tracée. La modification de ce nombre affectera la coordonnée y à laquelle réside la ligne rouge et vers laquelle la ligne d'approximation converge.
Questions connexes
De nouvelles questions
graph
Cette balise "graphique" fait référence à un graphique (tel qu'un graphique ou un diagramme) qui affiche la relation entre deux ou plusieurs variables. Pour la structure mathématique discrète composée de sommets et d'arêtes, utilisez la balise "graph-theory".