Tässä on 30-soluinen taulukko, johon kone arpoo lukuja väliltä 1-100:
public class Taulukko { public static void main (String[] args) { int luku; int[] taulukko = new int [30]; //Täytetään taulukko satunnaisluvuilla. for (int i=0; i<taulukko.length; i++) { luku= 1 + (int) (Math.random() * 100); taulukko[i]=luku; } //Tulostetaan taulukko. for (int i=0; i<taulukko.length; i++) { System.out.print(taulukko[i] + " "); } } }
Kysymys on: Mitä tuohon arvonta- ja syöttövaiheeseen pitää lisätä, jotta kone ei varmasti syötä taulukkoon samaa lukua uudelleen (duplikaatteja)?
public boolean contains(final int[] array, final int key) { for (final int i : array) { if (i == key) { return true; } } return false; }
Yksi yleinen ratkaisu on tosiaan se, että silmukassa toistetaan luvun arpomista, kunnes saadaan sopiva luku. Tähän vaaditaan siis ylimääräinen haku, jossa tutkitaan, onko sama luku jo listan aiemmissa indekseissä (0 - i-1).
Toinen vaihtoehto tällaisella melko pienellä lukujoukolla olisi se, että mahdolliset luvut laitetaan listaan ja joka arvontakerralla arvotaankin vain luku listan koon mukaan ja poistetaan saatu luku listalta.
// Vaihtoehdot taulukkoon: int vaihtoehdot[] = {1, 2, 3}; int vaihtoehtoja = 3; // Yhden luvun arvonta: int indeksi = (int)(Math.random() * vaihtoehtoja); vaihtoehtoja -= 1; int luku = vaihtoehdot[indeksi]; vaihtoehdot[indeksi] = vaihtoehdot[vaihtoehtoja];
Kolmas ratkaisu on käytännössä toisen ratkaisun sovellus: Jos arvotut luvut pidetään järjestyksessä (eli joka arvonnan jälkeen järjestetään taulukko), voidaan arvontaväliä edelleen pienentää yhdellä joka arvonnan jälkeen, ja sitten käydään aiemmat luvut pienimmästä alkaen läpi ja lisätään uuteen lukuun 1 aina, jos aiempi luku on sama tai pienempi.
Arvontaväli alussa: 0 - 13 ... tässä välissä arvonnat [0] ... [4] ... Arvotaan taulukko[5]: Aiemmat arvotut: 1 3 4 6 8 (järjestyksessä!) Arvotaan luku väliltä 0 - (13-i) eli 0 - 8 Arvonta tuottaa esim. luvun 3 1 < 3 -> saadaan 4 3 < 4 -> saadaan 5 4 < 5 -> saadaan 6 6 <= 6 -> saadaan 7 8 > 7 -> lopputulos 7 Nyt arvotut: 1 3 4 6 7 8 (järjestyksessä!)
Aihe on jo aika vanha, joten et voi enää vastata siihen.