View Full Version : [Java] Generare array con numeri non duplicati!
Salve a tutti!! Ho realizzato questo codice in java e vorrei sapere se c'è un metodo per evitare quel do-while orrendo in quanto si blocca sempre al momento dell'esecuzione! Come posso fare in base a questo codice ad evitare di stampare interi duplicati? Grazie!!!
int max = 20;
int[] ris = new int[10];
int error=0;
int temp=0;
// devo stampare 11 array random di 10 interi!
for(int i=0; i<11; i++){
for (int k=0; k<ris.length; k++){
\**Questo dovrebbe eliminare i duplicati ma il programma è come se va in loop e si blocca!
**/
/** Blocco in loop **/
do{
temp = (int) (max*Math.random())+1;
for(int j=0; j<k; j++){
if(ris[j]==temp){
error=1;
}
}
}while(error==1); //esegue il do finchè error=1
ris[k]=temp;
System.out.print(ris[k]+" ");
/** Blocco in loop **/
Spero possiate aiutarmi!! sto diventando matto!! Grazie!!:muro:
Non puoi usare un HashSet? O devi implementare te l'eliminazione dei duplicati?
mmh, ma ti sei scordato un pezzo di codice?
La condizione per impostare error = 1 non e' mai vera, perche' dentro ris non hai scritto nulla, quindi alluppa :)
Saluto
mmh, ma ti sei scordato un pezzo di codice?
La condizione per impostare error = 1 non e' mai vera, perche' dentro ris non hai scritto nulla, quindi alluppa :)
Saluto
Ma dove dentro questo ris[j]?
Comunque lo posso fare sia in un modo che nell'altro!! come funziona HashSet? non sono pratico in java!!
Qualche giorno fa un amico mi ha chiesto di aiutarlo su un esercizio scolastico penso identico al tuo, e glielo avevo fatto così
package provanico;
import java.util.Random;
public class ProvaNico
{
public static void main(String[] args)
{
int[] interiDiversi = new int[10];
Random rand = new Random();
int i = 0;
while(i < interiDiversi.length)
{
int interoCasuale = 1 + rand.nextInt(20);
boolean contiene = false;
for(int j = 0; j < i && !contiene; j++)
{
if(interoCasuale == interiDiversi[j])
contiene = true;
}
if(!contiene)
interiDiversi[i++] = interoCasuale;
}
for(Integer j : interiDiversi)
System.out.println(j);
}
}
Prova un po' a vedere se ti piace :)
Grazie mille proprio quello che mi serviva!!!:)
Un ultima cosa!! senti ma se a questo codice voglio aggiungere un ciclo for per stamparmi 11 array diversi di questo tipo come faccio? ad esempio nel codice mio iniziale avevo questo for for(int i=0; i<11; i++){
che mi stampava 11 array da 10 interi! ho provato ad aggiungerlo nel tuo, ma mi stampa 11 array tutti uguali al primo!!
Ma dove dentro questo ris[j]?
Comunque lo posso fare sia in un modo che nell'altro!! come funziona HashSet? non sono pratico in java!!
Scusami sono un po' rincoglionito e prima mi sa che ho detto una boiata.
Comunque hashset e' una implementazione di set. Non permette elementi duplicati. Quindi un:
while(set.size() != 10) set.add(random)
dovrebbe risolvere i tuoi problemi
Ancora saluto
Scusa non riesco a capire cosa intendi :( Anche perchè temo che tu per 11 array intenda 11 elementi. Ma anche in quel caso non capirei lo stesso :(
Ciao! scusami!! e più precisamente dove dovrei inserire
while(set.size() != 10) set.add(random)
nel mio codice?
int max = 20;
int[] ris = new int[10];
int error=0;
int temp=0;
// devo stampare 11 array random di 10 interi!
for(int i=0; i<11; i++){
for (int k=0; k<ris.length; k++){
\**Questo dovrebbe eliminare i duplicati ma il programma è come se va in loop e si blocca!
**/
/** Blocco in loop **/
do{
temp = (int) (max*Math.random())+1;
for(int j=0; j<k; j++){
if(ris[j]==temp){
error=1;
}
}
}while(error==1); //esegue il do finchè error=1
ris[k]=temp;
System.out.print(ris[k]+" ");
/** Blocco in loop **/
Un ultima cosa, con random intendi il generatore di numeri casuali Math.random()? Scusami ma non sono affatto esperto in java.. sono alle prime armi!!:)
Scusa non riesco a capire cosa intendi :( Anche perchè temo che tu per 11 array intenda 11 elementi. Ma anche in quel caso non capirei lo stesso :(
Ciao! in pratica il mio output(con eclipse) con il sorgente del mio primo messaggio è questo:
11 14 9 10 8 20 8 3 7 13
15 13 5 18 20 9 1 19 8 1
12 9 12 9 16 7 2 13 17 3
18 17 1 14 14 10 1 4 13 20
7 15 1 20 9 5 19 8 3 4
12 12 18 7 4 20 18 9 20 16
19 7 12 14 7 14 7 13 2 16
1 8 17 10 17 10 19 7 6 3
10 16 8 1 16 2 20 9 8 9
18 4 2 8 15 8 4 6 16 12
20 20 2 1 20 2 9 9 12 2
Vorrei creare una cosa simile.. mi stampa 11 array da 10 elementi random! però io voglio che gli elemeni di ogni singolo array siano diversi!!
come noti al primo array ci sono due 8! bene io voglio che siano tutti diversi! :)
Un HashSet ti permette di avere una collezione che non contiene elementi duplicati, esattamente la definizione di insieme comunemente adottata in matematica.
In pratica puoi risolvere così:
HashSet<Integer> set = new HashSet();
Random rnd = new Random();
int max = 20;
while (set.size() < 10) {
set.add(rnd.nextInt(max));
}
System.out.println(set);
Questo ti tira fuori qualcosa di questo tipo:
[0, 17, 18, 4, 5, 9, 10, 11, 13, 14]
Ovviamente reiterando l'algoritmo intero puoi fare quante sequenze vuoi.
Un ultima cosa, con random intendi il generatore di numeri casuali Math.random()? Scusami ma non sono affatto esperto in java.. sono alle prime armi!!:)
Intendevo un numero casuale :)
Se devi solo stampare i numeri e non ti servono gli array per farci altro puoi fare cosi
Set set;
for (int i = 0; i < 11; i++){
set = new HashSet(0)
System.out.println("Array numero " + i");
while(set.size() < 10){
int rnd = Math.random() * 100
set.add(rnd);
System.out.println(rnd);
}
}
Saluto
Edit: quello di warduck e' molto piu' bello :/
perfetto!! problema risolto!! C'è qualche metodo nell'Hashset che permette di ordinarli in maniera cresente gli elementi?
Ho capito, ti bastava aggiungere un for esterno al mio programma
package provanico;
import java.util.Random;
public class ProvaNico
{
public static void main(String[] args)
{
for(int k = 0; k < 11; k++)
{
int[] interiDiversi = new int[10];
Random rand = new Random();
int i = 0;
while(i < interiDiversi.length)
{
int interoCasuale = 1 + rand.nextInt(10);
boolean contiene = false;
for(int j = 0; j < i && !contiene; j++)
{
if(interoCasuale == interiDiversi[j])
contiene = true;
}
if(!contiene)
interiDiversi[i++] = interoCasuale;
}
for(Integer j : interiDiversi)
System.out.print(j + " ");
System.out.println();
}
}
}
perfetto!! problema risolto!! C'è qualche metodo nell'Hashset che permette di ordinarli in maniera cresente gli elementi?
No, un insieme è per definizione non numerabile/ordinabile, penso. Non vorrei usare termini sbagliati :D
perfetto!! problema risolto!! C'è qualche metodo nell'Hashset che permette di ordinarli in maniera cresente gli elementi?
Usando un TreeSet() al posto del hashset :)
Ok davvero grazie di cuore!!! Finalmente ci ho capito qualcosa!!! grazie davvero a tutti coloro che mi hanno risposto e saputo aiutare: Gold, ndakota, WarDuck
Alla prossima!!!:)
clockover
10-02-2010, 00:36
Posso darti un altro modo io!
Se hai un range massimo, ad esempio vuoi n numeri casuali e il massimo è m puoi fare in questo modo!
private static ArrayList<Integer> lista = crea();
private static ArrayList<Integer> crea(){
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int i = 0; i<=m; i++)tmp.add(i);
return tmp;
}
public static int[] getArray(int n){
ArrayList<Integer> tmp = (ArrayList)lista.clone();
int array[] = new int[n];
for(int i = 0; i<array.length; i++)
array[i] = tmp.remove(new Random().nexInt(tmp.size()));
}
se non sbaglio dovrebbe essere O(n)
NON SI RISOLVONO ESERCIZI SCOLASTICI PER INTERO, COME LO DEVO DIRE ?
PS: è maiuscola perché sto urlando
Salve! non sono esercizi scolastici, ma volevo solo crearmi un programmino di estrazioni casuali(Win4Life, infatti gli array sono composti da 10 elementi composti da numeri casuali da 1 a 20!), 11 array perchè se non erro (statistica) sono minimo 11 sistemi che bisogna realizzare per vincere almeno un premio base!! ;)
clockover
10-02-2010, 11:20
NON SI RISOLVONO ESERCIZI SCOLASTICI PER INTERO, COME LO DEVO DIRE ?
PS: è maiuscola perché sto urlando
non mi pare abbia detto che siano per la scuola
non mi pare abbia detto che siano per la scuola
Ma non mi pare nemmeno che abbia detto che siano per altro (almeno fino al post sopra) ;)
Poteva essere tranquillamente un esercizio scolastico.
Per la risoluzione del problema: si fa un ArrayList, vi si immettono tutti gli elementi fra 1 e 20. Si fanno 10 estrazioni casuali di numeri fra 0 e N-1 con N pari alla dimensione dell'ArrayList. Per ogni estrazione si rimuove dall'ArrayList l'elemento corrispondente.
E' importante diminuire il numero di elementi fra cui si fa l'estrazione random, altrimenti non si rispettano le proprietà statistiche dell'estrazione.
Infatti se estraggo 10 palline da un'urna contenente 20 palline, le palline che parteciperanno all'estrazione saranno ogni volta 20 meno il numero di estrazioni senza reimbussolamento già fatte.
clockover
10-02-2010, 13:31
Ma non mi pare nemmeno che abbia detto che siano per altro
Appunto... siamo in buona fede...
Comunque dai non è un problema! Per la soluzione che hai proposto comunque mi sembra la mia!
Appunto... siamo in buona fede...
Comunque dai non è un problema! Per la soluzione che hai proposto comunque mi sembra la mia!
Quello che volevo dire è che è sempre meglio accertarsi delle intenzioni di chi posta. Ad esempio, anche proporre una soluzione a parole, invece che con il codice, è sicuramente meglio rispetto a dare tutto il codice già pronto.
In effetti la soluzione è identica...
Ma non mi pare nemmeno che abbia detto che siano per altro (almeno fino al post sopra) ;)
Poteva essere tranquillamente un esercizio scolastico.
Per la risoluzione del problema: si fa un ArrayList, vi si immettono tutti gli elementi fra 1 e 20. Si fanno 10 estrazioni casuali di numeri fra 0 e N-1 con N pari alla dimensione dell'ArrayList. Per ogni estrazione si rimuove dall'ArrayList l'elemento corrispondente.
E' importante diminuire il numero di elementi fra cui si fa l'estrazione random, altrimenti non si rispettano le proprietà statistiche dell'estrazione.
Infatti se estraggo 10 palline da un'urna contenente 20 palline, le palline che parteciperanno all'estrazione saranno ogni volta 20 meno il numero di estrazioni senza reimbussolamento già fatte.
Quoto. Che e' anche la soluzione di clockover
NON SI RISOLVONO ESERCIZI SCOLASTICI PER INTERO, COME LO DEVO DIRE ?
PS: è maiuscola perché sto urlando
Ehi Cionci, mi sembrava abbastanza chiaro che cercasse dei numeri per il gioco winforlife^^
Salve! non sono esercizi scolastici, ma volevo solo crearmi un programmino di estrazioni casuali(Win4Life, infatti gli array sono composti da 10 elementi composti da numeri casuali da 1 a 20!), 11 array perchè se non erro (statistica) sono minimo 11 sistemi che bisogna realizzare per vincere almeno un premio base!!
Err... no :p
La statistica non e' il mio forte (ci metto un po' a fare i calcoli giusti^^), ma senza scomodarla posso dirti che da quel algoritmo possono uscire due 'serie' identiche :D
Saluto
Edit: clockover, bella soluzione, c'ho un po' di invidia :/
clockover
10-02-2010, 21:37
:sofico: :sofico:
La soluzione di cionci è la migliore in effetti...
La soluzione di cionci è la migliore in effetti...
E' uguale a quella di clockover...non l'avevo vista ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.