import java.util.Random;
import java.text.*;

/**
* Arpanoppa on olio, jolla voidaan mallintaa arpanopan toiminnallisuutta.
* Arpanopan sivujen määrä on asetettavissa alustuksen yhteydessä. Lisäksi
* olio ylläpitää tilastotietoja, jotka on tulostettavissa näytölle.
* <p>
* Seuraavassa esimerkkiohjelmassa luodaan ensin ilmentymä
* kuusisivuisesta arpakuutiosta, jota heitetään kunnes heitettyjen
* silmälukujen yhteenlaskettu summa on vähintään 100.
* Heittojen lopuksi tulostetaan tilastotiedot heitoista.
*
* <pre>
*     // Luodaan ilmentymä Arpanoppa-oliosta.
*     Arpanoppa noppa = new Arpanoppa();
*
*     // Esitellään muuttuja, johon tallennetaan heitettyjen
*     // silmälukujen summa.
*     int heittojensumma = 0;
*
*     // Heitetään noppaa niin kauan, kuin heitettyjen silmälukujen
*     // summa on alle 100.
*     while (heittojensumma < 100)
*         heittojensumma = heittojensumma + noppa.heita();
*
*     // Tulostetaan heittojen tilastotiedot.
*     noppa.tilasto();
* </pre>
*
* Seuraavassa esimerkkiohjelmassa luodaan ilmentymä kaksisivuisesta
* arpanopasta, jolla heitetään kruunaa ja klaavaa.
*
* <pre>
*     // Luodaan ilmentymä Arpanoppa-oliosta.
*     Arpanoppa kolikko = new Arpanoppa(2);
*
*     // Tarkistetaan tuliko kruuna vai klaava..
*     if (kolikko.heita() == 1) {
*         System.out.println("Kruuna");
*     } else {
*         System.out.println("Klaava");
*     }
* </pre>
*
* @author   Mauri Heinonen
* @version  2.0
* @see      java.util.Random
*/
public class Arpanoppa {

        /**
        * Random-olion ilmentymä.
        */
        Random generator = new Random();

        /**
        * Arpanopan sivujen määrä.
        * Sivujen määrä asetetaan alustuksen yhteydessä.
        */
        final int sivuja;

        /**
        * Arponopan heittojen kokonaismäärä.
        */
        int heittoja;

        // Piirrettävän palkin maksimipituus.
        final int maxpituus = 40;

        /**
        * Taulukko, johon tallennetaan tilastotietoa
        * heitetyistä arvoista.
        */
        private int[] tilastotaulukko;

        /**
        * Luokan konstruktori. Luo oletusarvoisesti
        * kuusisivuisen nopan.
        */
        public Arpanoppa() {
                this(6);
        }

        /**
        * Luokan konstruktori. Luo nopan, jossa on
        * haluttu määrä sivuja sekä alustaa tilastotaulukon.
        *
        * @param alustus nopan sivujen lukumäärä
        */
        public Arpanoppa(int alustus) {
                sivuja = alustus;
                tilastotaulukko = new int[alustus];
                heittoja = 0;
        }

        /**
        * Heittää noppaa ja palauttaa nopan silmäluvun.
        *
        * @return heitetty silmäluku
        */
        public int heita() {

                // Muodostetaan uusi  silmäluku.
                int heitetty = generator.nextInt(sivuja) + 1;

                // Päivitetään tilastotaulukko.
                tilastotaulukko[heitetty-1] = tilastotaulukko[heitetty-1] + 1;

                // Kasvatetaan heittojen määrää yhdellä.
                heittoja = heittoja + 1;

                // Palautetaan heitetty silmäluku.
                return heitetty;
        }

        /**
        * Tulostaa tilastotietoja nopalla heitetyistä
        * silmäluvuista.
        *
        * Metodi tulostaa seuraavan kaltaisen tilaston:
        * <pre>
        * Heittojen tilastotiedot
        *    1  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      52  (52%)
        *    2  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX          48  (48%)
        *
        * Heittoja yhteensä 100 kappaletta.
        * </pre>
        */
        public void tilasto() {

                // Muuttujien esittely.
                int suurin=0;           // Suurin heittomäärä.
                int pituus;             // Palkin X-merkkien määrä.
                String silmaluku;       // Silmäluvusta muodostettava merkkijono.
                String palkki;          // Merkeistä muodostettu palkki.
                String maara;           // Määrästä muodostettava merkkijono.
                String prosentti;       // Prosentista muodostettava merkkijono.

                // Tulostetaan taulukon otsake.
                System.out.println("Heittojen tilastotiedot\n");

                // Selvitetään suurin heittomäärä.
                for (int i=0; i < tilastotaulukko.length; i++) {
                        if (tilastotaulukko[i] > suurin) {
                                suurin = tilastotaulukko[i];
                        }
                }

                // Käydään lävitse taulukon jokainen solu ja tulostetaan
                // kullekin silmäluvulle tilastotietorivi.
                for (int i=0; i < tilastotaulukko.length; i++) {

                        // Muodostetaan silmäluvusta neljän merkin merkkijono.
                        silmaluku = "    " + (i+1);
                        silmaluku = silmaluku.substring(silmaluku.length() - 4);

                        // Lasketaan palkin X-merkkien määrä.
                        pituus = (int)(((float)tilastotaulukko[i]/suurin)*maxpituus);

                        // Alustetaan palkki tyhjäksi merkkijonoksi.
                        palkki = "";

                        // Muodostetaan palkin X-merkkin osuus.
                        for (int j=1; j <= pituus; j++) {
                                palkki = palkki + "X";
                        }

                        // Muodostetaan palkin välilyöntimerkkien osuus.
                        for (int j=1; j <= (maxpituus - pituus); j++) {
                                palkki = palkki + " ";
                        }

                        // Muodostetaan heittojen määrästä kuuden merkin mittainen
                        // merkkijono.
                        maara = "      " + tilastotaulukko[i];
                        maara = maara.substring(maara.length()-6);

                        // Muodostetaan prosenttiluku.
                        MessageFormat mf = new MessageFormat("{0,number,percent}");
                        Object[] luku = {new Float((float)tilastotaulukko[i]/heittoja)};
                        prosentti = mf.format(luku);

                        // Tulostetaan tilastorivin tiedot.
                        System.out.println(silmaluku + "  " + palkki + "  " + maara + "  (" + prosentti + ")");

                }

                // Tulostetaan heittojen kokonaismäärä.
                System.out.println("\nHeittoja yhteensä " + heittoja + " kappaletta.");

        }
}

Appletit:
DoupleClick HelloButton HelloButtonExample1 HelloButtonExample2 HelloButtonExample3 HelloButtonExample4 HelloClick HelloClick2 HelloColor HelloFont HelloImage HelloLine HelloStatus HelloWorld2 HelloWorldApplet MyEvent ScrollingText

Itsenäiset:
Break Continue HelloWorld Jatka Kertoma Kertotaulu Koe KoeNro LueMerkki LueMjonoon LueTied Merkkijono Silmukat Summaa Tahdet Tietotyypit Tilavuus Laskuri EnsimmaisetMetodit Lue LueTietoja Muunnos MuuttujienAlkeet Tulostus Arpanoppa