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.