Arpoo pisteitä neliönmuotoiselle alueelle, katsoo kuuluuko arvottu piste ympyrän sisälle ja laskee näiden arpomalla saatujen tietojen perusteella piin likiarvoa.
Tämä metodi ei ole kovinkaan tarkka, eikä nopea, mutta onpahan kuitenkin... :)
Valmis käännetty appletikin löytyy osoitteesta http://www.paivola.net/~sami/java/pii/pii.html
import java.awt.*; import java.applet.*; public class Pii extends Applet{ //Laskurit laskemaan sisälle ja ulos osuneita pisteitä int sisalla, ulkona; int arvottu; //Tekstikenttä likiarvon tulostamista varten Label pii; public void init() { //Koon asettaminen ja laskurien alustaminen //Laskennan kannalta koko on samantekevää, //mutta alueen pitää olla neliön muotoinen! this.setSize(500, 500); sisalla = 0; ulkona = 0; arvottu = 0; pii = new Label(); add(pii); } public void paint(Graphics g) { //Asetetaan tekstikenttä sopivan kokoiseksi pii.setBounds(this.getWidth() / 2 - 75, 10, 150, 20); //Pyöritään silmukassa koko loppuelämä... while (true) { //Arvotaan uusi piste double x = Math.random() * this.getWidth(); double y = Math.random() * this.getHeight(); //Jos piste on alueen sisällä, maalataan se punaisella, //ulkopuolella olevat pisteet maalataan vihreällä if (onkoSisalla(x, y)) { int red, green, blue; red = (int)(Math.random() * 100) + 155; green = (int)(Math.random() * 100); blue = (int)(Math.random() * 100); g.setColor(new Color (red, green, blue)); } else { int red, green, blue; red = (int)(Math.random() * 100); green = (int)(Math.random() * 100) + 155; blue = (int)(Math.random() * 100); g.setColor(new Color (red, green, blue)); } //Piirretään piste g.drawLine((int)x, (int)y, (int)x, (int)y); arvottu++; //Näytetään piin arpomalla saatu likiarvo 10000 kierroksen välein //sekä konsolissa, että piirtopinnalla if (arvottu % 10000 == 0) { System.out.println((4.0 * sisalla) / (double)arvottu); pii.setText("" + (4.0 * sisalla) / (double)arvottu); } } } //Metodi, joka tarkistaa kuuluuko piste ympyrän sisälle vai ei. //Laskemiseen käytetään perinteistä Pythagoraan lausetta, eli //a^2 + b^2 = c^2 public boolean onkoSisalla(double x, double y) { if (Math.sqrt(Math.pow(((this.getWidth() / 2) - x), 2) + Math.pow(((this.getHeight() / 2) - y), 2)) < this.getHeight() / 2) { sisalla++; return true; } else { ulkona++; return false; } } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.