Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Array Multidimensionale con interi casuali all'interno

    Ciao a tutti,
    come leggerete dal titolo, devo riempire ogni cella di un array multidimensionale con un numero casuale che però non sia già stato inserito nelle altre celle.

    Per farlo ho sviluppato questo codice, che però per certi versi non mi piace (vedere i commenti)

    codice:
    	public int[][] randomizeField(int[][] f){
    		int[] temp = new int[16];
    		int[][] ret = new int[f.length][f[0].length];
    		int r;
    		
    		//riempio tutto l'array con uno stesso numero che non mi serve
    		//in modo che potrò sostuirlo sempre con uno generato dal random sotto
    		//METODO ORRIBILE (se poi decido di aumentare i quadrati?)
    		for(int i = 0; i < temp.length; i++){
    			temp[i] = 20;
    		}
    		
    		for(int i = 0; i < temp.length; i++){			
    			do{
    				r = randomGenerator.nextInt(16);
    			} while (isInArray(temp, r));
    			
    			temp[i] = r;
    		}
    		
    		for(int i = 0, k = 0; i < ret.length; i++){
    			for(int j = 0; j < ret[0].length; j++, k++){
    				ret[j][i] = temp[k];
    			}
    		}
    		
    		return ret;
    	}
    	
    	//Il metodo qua sotto l'ho dovuto creare nonostante l'esistenza del metodo binarySearch
    	//perché quest'ultimo mi dava problemi insoliti.
    	public static boolean isInArray(int[] arr, int key){
    		for(int x : arr)
    			if(x == key)
    				return true;
    		
    		return false;
    	}
    Come avrete letto non mi piace per niente il metodo del riempire l'array con un valore che non mi serve in questo momento.
    Vi spiego innanzitutto perché l'ho fatto: nell'array mult mi serve avere casualmente nelle varie celle numeri da 0 a 15.
    Quindi creo un numero casuale, controllo se è già dentro l'array e in caso affermativo creo un nuovo numero e ripeto.
    Il problema è questo: lo zero. A me lo zero serve come numero significativo solo che già all'istaziamento dell'array questo è presente quindi se il randomizer me lo creerà vedrà che già c'è e quindi lo scarterà.

    Come posso evitare questa cosa?
    Flash Developer for Rich Media
    PHP, jQuery Developer

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Array Multidimensionale con interi casuali all'interno

    Originariamente inviato da Miroku
    Quindi creo un numero casuale, controllo se è già dentro l'array e in caso affermativo creo un nuovo numero e ripeto.
    Come posso evitare questa cosa?
    Se il range dei valori random è noto a priori e il range non è elevatissimo, si crea un array o collezione contenente ogni valore unico, quindi si "mescola" l'insieme e poi si possono estrarre i numeri unici in sequenza random.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ehm non credo di aver afferrato :master:

    Cmq per ora il range è noto a priori ed 0...15, ma pensavo che in futuro potesse essere una decisione dell'utente =\
    Flash Developer for Rich Media
    PHP, jQuery Developer

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Miroku
    Ehm non credo di aver afferrato :master:

    Cmq per ora il range è noto a priori ed 0...15, ma pensavo che in futuro potesse essere una decisione dell'utente =\
    Si crea un array, io adesso qui lo metto con dei "literal" come esempio, ma si può benissimo calcolare la dimensione e popolarlo dinamicamente (magari incapsulando il tutto in una classe es. UniqueRandomInt).

    int[] arr = { 10, 11, 12, 13, 14, 15 };

    per avere dei numeri "unici" tra 10 e 15.

    Per avere la sequenza ma in modo "casuale" la si mescola. Purtroppo esiste un metodo shuffle() solo in java.util.Collections per mescolare un List. Nel framework non c'è l'equivalente per gli array. Si può cercare una libreria esterna che abbia questa funzionalità ma in ogni caso è abbastanza semplice fare il mescolamento.

    Basta fare un ciclo e usare appropriatamente un Random. Per ogni posizione si sceglie uno dei valori e si fanno degli scambi (è più complicato a spiegarlo che a farlo ....).

    A quel punto hai la sequenza di numeri unici ma in ordine casuale.

    E lo ripeto ancora, se si vuole fare una buona cosa si può "incapsulare" il tutto in una classe. Il costruttore potrebbe ricevere i due valori che descrivono il range min/max e la classe potrebbe offrire 2 metodi: boolean hasNext() e int next() (in stile Iteratore/enumeratore).

    Tutto qua.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.