Forum » Programiranje » [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.
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
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.
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 ::
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java - DN] Naključna številaOddelek: Šola | 1364 (893) | nyler |
» | [Java] Domača nalogaOddelek: Šola | 871 (743) | lebdim |
» | JAVA - Math.random, kako določit interval?Oddelek: Programiranje | 5173 (2829) | Sergio |
» | java in deležiOddelek: Programiranje | 1163 (1010) | phyro |
» | osnove v Javi - zvezdiceOddelek: Programiranje | 3573 (2795) | Tutankhamun |