Matrice random java

891

Nuovo Utente
77
7
Ciao a tutti, mi sapete dare dei consigli oppure dirmi direttamente il codice per riempire una matrice di int con numeri random tutti diversi tra loro? Non combino proprio!! Per riempirla di random lo so fare ma non riesco a inserirli uno diverso dall'altro. Se possibile senza importare librerie tipo arrays ma nel modo più semplice possibile
 

brgVE

Utente Attivo
131
37
CPU
Intel i7 6700
Dissipatore
Scythe Kotetsu
Scheda Madre
Asrock z170 extreme 4
HDD
WD blue 1TB
RAM
Crucial ballistix 8gb
GPU
Palit gtx 1070 Super Jetstream
Monitor
LG 25UM57
PSU
EVGA supernova g2 550w
Case
Fractal Design ARC midi R2
OS
Windows10
fai una verifica.. se l'array contiene già il numero che andresti ad inserire, non lo inserisci e ne gerei un'altro..

es.

Codice:
...
int[] v = new int[x];
int vSize = 0;

for (int i = 0; i < x; i++) {[INDENT]int a = (int)(Math.random()*costanteMoltiplicativa);

while (contains(a)) a = (int)(Math.random()*costanteMoltiplicativa);

v[vSize++] = a;
[/INDENT]
 }

...
private boolean contains(int a) {[INDENT]for (int i = 0; i < vSize; i++)
[/INDENT]
[INDENT=2]if (v[i] == a) return true;[/INDENT]
[INDENT]return false;
[/INDENT]
}
 
Ultima modifica:

891

Nuovo Utente
77
7
fai una verifica.. se l'array contiene già il numero che andresti ad inserire, non lo inserisci e ne gerei un'altro..

es.

Codice:
...
int[] v = new int[x];
int vSize = 0;

for (int i = 0; i < x; i++) {[INDENT]int a = (int)(Math.random()*costanteMoltiplicativa);

while (contains(a)) a = (int)(Math.random()*costanteMoltiplicativa);

v[vSize++] = a;
[/INDENT]
 }

...
private boolean contains(int a) {[INDENT]for (int i = 0; i < vSize; i++)
[/INDENT]
[INDENT=2]if (v[i] == a) return true;[/INDENT]
[INDENT]return false;
[/INDENT]
}

Non combino... Ah visto che è un esercizio che mi è stato dato, non posso aggiungere metodi. Io ho provato a buttare giu qualcosa ma non mi viene proprio.

Codice:
    public static void main(String[] args)  {
        Random r = new Random();
        int casuale;
        int[] a  = new int[4];
        int i = 1;
        a[0] = r.nextInt(4);
        
        while(i<a.length){
            casuale = r.nextInt(4);
            for(int j = 0;j<i;j++)
                if(casuale==a[j]) {
                    casuale = r.nextInt(4);
                    
                }
                else {
                    a[i] = casuale;
                    i++;
                }
        }

Non riesco a trovare un modo per verificare la presenza di uno stesso numero. Ah qua nell'esempio ho creato un array di 4 numeri e cercato di mettervi dentro casualmente i primi 4 numeri
 

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro
Non combino... Ah visto che è un esercizio che mi è stato dato, non posso aggiungere metodi. Io ho provato a buttare giu qualcosa ma non mi viene proprio.

Codice:
    public static void main(String[] args)  {
        Random r = new Random();
        int casuale;
        int[] a  = new int[4];
        int i = 1;
        a[0] = r.nextInt(4);
        
        while(i<a.length){
            casuale = r.nextInt(4);
            for(int j = 0;j<i;j++)
                if(casuale==a[j]) {
                    casuale = r.nextInt(4);
                    
                }
                else {
                    a[i] = casuale;
                    i++;
                }
        }

Non riesco a trovare un modo per verificare la presenza di uno stesso numero. Ah qua nell'esempio ho creato un array di 4 numeri e cercato di mettervi dentro casualmente i primi 4 numeri


Diciamo che c'è un pò di confusione.

Primo: non sono propriamente d'accordo sull'iniziare a riempire l'array all'esterno del ciclo while(), questo però è un discorso "personale" e di ordine del codice.

Secondo: utilizzi la variabile i come condizione per uscire dal ciclo for() e nello stesso ciclo for() la modifichi rischi di entrare in un loop infinito se continui a generare numeri sempre diversi. Ricordati che non devi quasi mai (a meno che vuoi generare un "loop infinito controllato" utilizzare la stessa variabile sia come condizione sia come "puntatore". per ovviare a questo problema utilizza una variabile d'appoggio.

Personalmente partirei nel modo più stupido possibile per poi continuare a migliorare il codice
Codice:
public static void main(String[] args)  {
        Random r = new Random();
        int casuale;
        int[] a  = new int[4];
        int i = 0;
        // La varaibile continua mi indica se il numero casuale appena generato è già presente
        boolean continua = true;
                
        while(i < a.length){

            casuale = r.nextInt(4);

            for(int j = 0;j<i;j++) {

                  if(casuale==a[j]) 
                      continua = false;
                  
             }
                
             if(continua) {
                  a[i] = casuale;
                  i++;
             }

            // reset della variabile continua
           continua = true;

        }
}
 
  • Mi piace
Reazioni: brgVE e 891

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro
Mi daresti ancora una mano? Grazie
Non te lo devo fare io. :)
Prima scrivi un pò di codice tu da solo. In caso non riesci posta qui quello che hai fatto e ci ragioniamo assieme. ;)
 
  • Mi piace
Reazioni: Mursey

891

Nuovo Utente
77
7
Codice:
import java.util.Random;


public class PROVACASUALI {
	public static void main(String[] args)  {
        Random r = new Random();
        int casuale;
        int[][] a  = new int[4][4];
        int i = 0;
        // La varaibile continua mi indica se il numero casuale appena generato è già presente
        boolean continua = true;  
        int y = 0;
        while (y<a.length) {
        
        while(i < a[y].length){
            casuale = r.nextInt(8);
            for(int j = 0;j<i;j++) {
                  if(casuale==a[y][j]) 
                      continua = false;                  
             }                
             if(continua) {
                  a[y][i] = casuale;
                  i++;
                  y++;
             }
            // reset della variabile continua
           continua = true;
           
        }
        }


		for(int t = 0;t<a.length;t++)
			System.out.println(a[t]);
	}
}

Qua mi viene errore però credo di averlo capito il ragionamento, cioè inserisco un ciclo esterno che ripete il procedimento per nuove righe. Il problema è che non mi combino con le matrici e tra variabili varie vado in confusione
 

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro
Codice:
import java.util.Random;


public class PROVACASUALI {
    public static void main(String[] args)  {
        Random r = new Random();
        int casuale;
        int[][] a  = new int[4][4];
        int i = 0;
        // La varaibile continua mi indica se il numero casuale appena generato è già presente
        boolean continua = true;  
        int y = 0;
        while (y<a.length) {
        
        while(i < a[y].length){
            casuale = r.nextInt(8);
            for(int j = 0;j<i;j++) {
                  if(casuale==a[y][j]) 
                      continua = false;                  
             }                
             if(continua) {
                  a[y][i] = casuale;
                  i++;
                  y++;
             }
            // reset della variabile continua
           continua = true;
           
        }
        }


        for(int t = 0;t<a.length;t++)
            System.out.println(a[t]);
    }
}

Qua mi viene errore però credo di averlo capito il ragionamento, cioè inserisco un ciclo esterno che ripete il procedimento per nuove righe. Il problema è che non mi combino con le matrici e tra variabili varie vado in confusione

Ok. Vedo che la base più o meno c'è.
Prima di tutto.
i casuali si possono ripetere sulle colonne delle diverse righe? Per capirci, questa matrice è valida (si ripetono il 7 e l'1 ma su righe diverse)?
| 1 | 3 | 7 | 4 |
| 7 | 5 | 6 | 1 |
... ...
... ...
Se è valida bene, altrimenti bisogna modificare più roba.

Fammi sapere.
 
  • Mi piace
Reazioni: 891

891

Nuovo Utente
77
7
Si ci sarei arrivato dopo comunque dovrei riempire la matrice con casuali diversi tra loro, naturalmente se la matrice è 4x4 i casuali vanno da 0 a 15 senza ripetizioni
 

TheJudge

Utente Attivo
335
84
CPU
i5-8600k
Dissipatore
Cooler Master TX3 EVO
Scheda Madre
MSI Z370 SLI PLUS
HDD
SAMSUNG 840 Pro 250GB + SSD Sandisk 250GB
RAM
Hiperx 2x8GB DDR4 @2666Hz
GPU
Asus Strix 1070TI
Monitor
1 Asus 24" fullHD + BENQ 27" fullHD
PSU
EVGA SuperNova 850W 80+ gold
Case
NZXT S340
OS
Windows 10 Pro
Si ci sarei arrivato dopo comunque dovrei riempire la matrice con casuali diversi tra loro, naturalmente se la matrice è 4x4 i casuali vanno da 0 a 15 senza ripetizioni

utilizzando una variabile array di appoggio, riempito con i numeri validi, ti viene tutto molto semplice.

Non l'ho provato ma sono abbastanza sicuro che funzioni.
Fammi sapere se non capisci qualcosa.

Codice:
	Random r = new Random();
        int casuale;
        int[][] a  = new int[4][4];
        // riempio l'array con i numeri univoci che mano a mano inserisco
        int[] app = new int[16];
        int colonne = 0;
        
        boolean continua = true;  
        
        for(int righe = 0; righe<a.length; righe++) {
        	
        	while(colonne < a[0].length) {


        		casuale = r.nextInt(16);
        		
        		for(int i=0; i<(colonne + a[0].length*righe); i++) {
        			
        			if(casuale == app[i])
        				continua = false;
        			
        		}
        		
        		if(continua) {
        			
        			a[righe][colonne] = casuale;
        			// colonne va da 0 a 3 ma app è un array di 16 posizioni
        			app[colonne + a[0].length*righe] = casuale;
        			colonne++;
        		}
        		
        		continua = true;
        		
        	}
        	
        	colonne = 0;
        	
        }




	for(int t = 0;t<a.length;t++) {
	    for(int k=0;k<4;k++)
    	       System.out.print(a[t][k] +" | ");
		    
           System.out.println("");
		    
	}
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili