Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Satunnaisluvut ja duplikaatioiden välttäminen taulukossa

Sörsseli [22.01.2019 12:52:28]

#

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)?

TapaniS [22.01.2019 13:27:43]

#

From here:

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}

Metabolix [22.01.2019 17:18:54]

#

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ä!)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta