» »

[JAVA]Generiranje naključnih števil

[JAVA]Generiranje naključnih števil

jeryslo ::

Pozdravljeni!

Zanima me, kako bi generiral z Math.random RAZLIČNA naključna števila od 1-9.

Ustvaril sem polje[] in potem v for zanki napolnil z polje[j] = (int)(Math.random()*8) + 1;

Toda moram imeti števila od 1 do 9, torej se ne smejo ponavljati. Nekaj sem študiral, da bi naredil še eno polje in tja shranjeval vrednosti potem pa vsako novo naključno število primerjal s prejšnjim. Toda nevem, kako naj primerjam z vsemi števil, ki sem jih prej zgeneriral.

salesky ::

Ena možnost je da uporabiš množico Set, kjer ti avtomatično preverja če je že neko število v množici. Če je, jo lepo ignoriraš in maš to kar želiš.

LP

netanyahu ::

Najprej: `(int)(Math.random()*8) + 1´ generira števila med vključno 1 in vključno 8, ne 9.

Tvoj problem rešiš tako, da vsakič, ko želiš zapolniti en element tabele z novim naključnim številom, preveriš, ali je že bilo uporabljeno v že napolnjenem delu tabele. Če je že bilo, izbereš novo število in ponovno preveriš.

Bolj eleganten pa je naslednji način: tabelo napolniš naraščajoče s števili 1 .. 9. Nato jih premešaš — vsak element tabele zamenjaš z nekim drugim, indeks izbereš naključno.

/* kodo je popacil slo-techov olepsevalnik kode */
public class Test {
    public static void main(String[] args) {
        int[] a = new int[9];

        // nacin 1
        // razsiritev tvoje metode
        for(int i=0; i<a.length; i++) {
            boolean done = false;
            while(!done) {
                a[i] = (int)(Math.random()*9) + 1;
                done = true;
                // preveri vse predhodnike
                for(int j=0; j<i; j++) {
                    if(a[j] == a[i]) {
                        done = false;
                        break;
                    }
                }
            }
            
        }
        // izpis
        for(int i=0; i<a.length; i++) {
            System.out.printf("%d ", a[i]);
        }
        System.out.println();

        // nacin 2
        // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
        for(int i=0; i<a.length; i++) {
            a[i] = i+1;
        }
        for(int i=0; i<a.length-1; i++) {
            int k = (int)(Math.random()*a.length);
            // exchange a[i], a[k]
            int tmp = a[i];
            a[i] = a[k];
            a[k] = tmp;
        }
        // izpis
        for(int i=0; i<a.length; i++) {
            System.out.printf("%d ", a[i]);
        }
        System.out.println();
    }
}

jeryslo ::

Res najlepša hvala za izčrpno pomoč.

jeryslo ::

Spet rabim pomoč glede tega, namreč imam polje velikosti 10. Zdaj bi pa rad preverju samo zadnje polje, da se ne ujema s prejšnjimi. Na ta način, ki mi ga je predlagal netanyahu program dela BP:
public class test2
{public static void main(String[] args)
{
int[] polje = new int[10];
boolean done = false;
int stevilo = 0;
for(int i = 0; i < 10; i++)
{
polje[i] = (int)(Math.random()*10) + 1;
if(i == 9)
{
while(!done)
{
polje[i] = (int)(Math.random()*10) + 1;
done = true;

for(int j = 0; j < i; j++)
{
if(polje[j] == polje[i])
{
done = false;
break;
}
}
}
}
}
for(int i = 0; i < 10; i++)
{
System.out.print(polje[i] + " ");
}
}
}

Zdaj bi pa rad naredil še na tale, drugi način:

public class test
{public static void main(String[] args)
{
int[] polje = new int[10];
boolean done = false;
int stevilo = 0;
for(int i = 0; i < 10; i++)
{
polje[i] = (int)(Math.random()*10) + 1;
if(i == 9)
{

while(!done)
{
polje[i] = (int)(Math.random()*10) + 1;
done = true;


if(polje[i] == polje[0] | polje[i] == polje[1] | polje[i] == polje[2] | polje[i] == polje[3] | polje[i] == polje[4] | polje[i] == polje[5] | polje[i] == polje[6] | polje[i] == polje[7] | polje[i] == polje[8])
{
done = false;
break;
}
}
}
}
for(int i = 0; i < 10; i++)
{
System.out.print(polje[i] + " ");
}

}
}

Vendar mi ta drugi način ne deluje pravilno, namreč ne upošteva pogoja IF in zgenerira v zadnjem polju število, ki se že nahaja v kateremkoli prejšnjem polju.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java - DN] Naključna števila

Oddelek: Šola
121279 (808) nyler
»

[Java] Domača naloga

Oddelek: Šola
7801 (673) lebdim
»

JAVA - Math.random, kako določit interval?

Oddelek: Programiranje
205078 (2734) Sergio
»

java in deleži

Oddelek: Programiranje
61072 (919) phyro
»

osnove v Javi - zvezdice

Oddelek: Programiranje
403388 (2610) Tutankhamun

Več podobnih tem