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);
  }
}
2
Student01 19 août 2018 à 22:02

1 réponse

Meilleure 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.

enter image description here

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.

1
micycle 20 août 2018 à 21:18