Creare coppie univoche di numeri

di il
7 risposte

Creare coppie univoche di numeri

Ciao ,

Sono all'inizio con java e vorrei chiedervi un consiglio su come realizzare questo algoritmo . Il problema infatti prescinde dal linguaggio anche se
sono cmq un principiante.
Dovrei creare 10 coppie di numeri non identiche. Quello che sto tentando di fare come esercizio e il giochino della battagli navale puramente testuale.
Secondo voi una volta create le 10 coppie con la classe randomGenerator per eliminare le coordinate doppie delle navi devo eseguire un ciclo
ogni volta e confrontarlo con il nuovo numero random o esiste un modo/alogoritmo migliore?
Qui non ho ancora implementato quell'algoritmo , vorrei poter iniziare col piede giusto senza rischiare di ingarbugliarmi nel codice

import java.util.Scanner;
import java.util.Random;

public class principale
{
   public static final int nCoordinate = 25;  //Static final crea una costante 
   
  public static void main (String args[])
  {
    nave[] nave = new nave[nCoordinate] ; // Ho creato un array di oggetti di tipo "nave".
    int randomPosX = 0; // variabile locale dichiarata all'interno di un metodo deve essere inizializzata pena errore di runtime
    int randomPosY = 0; // variabile locale dichiarata all'interno di un metodo deve essere inizializzata pena errore di runtime
    
    int posX =0;
    int posY =0;
    
    Random randomGenerator = new Random(); //creo un oggetto di tipo Random e di nome "randomGenerator" utilizzando la libreria Util

    for ( int n=0; n<10; n++)  // Crea 10 coppie di oggetti di tipo nave e assegna per ognuna due coordinate (x,y)
    {
      randomPosX = randomGenerator.nextInt(10);
      randomPosY = randomGenerator.nextInt(10);
            
      nave[n] = new nave(randomPosX,randomPosY);
    }
    
    Scanner input = new Scanner(System.in);
    System.out.print("Scegli la coordinate x");
    int x = input.nextInt();
    System.out.print("Scegli la coordinate y");
    int y = input.nextInt();
  }
}  
   

7 Risposte

  • Re: Creare coppie univoche di numeri

    Cyrano ha scritto:


    Secondo voi una volta create le 10 coppie con la classe randomGenerator per eliminare le coordinate doppie delle navi devo eseguire un ciclo ogni volta e confrontarlo con il nuovo numero random o esiste un modo/alogoritmo migliore?
    Quando si vogliono estrarre casualmente elementi "unici" (che poi non si ripetano) e il numero di elementi è "ragionevole", la soluzione tipica è quella di metterli tutti in un array/lista, estrarre "a caso" un indice e prendere il valore al tal indice. Poi "riempi" il buco con l'ultimo elemento e riduci la dimensione "logica". E si continua così.
  • Re: Creare coppie univoche di numeri

    Soluzione piu' semplice: prendi un verrore di N elementi, lo riempi con i numeri 0..N-1, quindi lo mescoli, a questo punto prendi il contenuto del vettore partendo dall'indice 0, 1, 2, ...N-1
  • Re: Creare coppie univoche di numeri

    andbin ha scritto:


    Cyrano ha scritto:


    Secondo voi una volta create le 10 coppie con la classe randomGenerator per eliminare le coordinate doppie delle navi devo eseguire un ciclo ogni volta e confrontarlo con il nuovo numero random o esiste un modo/alogoritmo migliore?
    Quando si vogliono estrarre casualmente elementi "unici" (che poi non si ripetano) e il numero di elementi è "ragionevole", la soluzione tipica è quella di metterli tutti in un array/lista, estrarre "a caso" un indice e prendere il valore al tal indice. Poi "riempi" il buco con l'ultimo elemento e riduci la dimensione "logica". E si continua così.
    Penso di aver capito , ci provo . Al limite se vi sembra il caso riposto tutto


    @migliorabile: Per mescolare dovrò comunque trovare una posizione casuale per ogni elemento

    Mi sembra un esercizio interessante in entrambi i casi , ci provo
  • Re: Creare coppie univoche di numeri

    Il mescolamento e' banale: scandisci il vettore partendo dall'inizio (i=0,,1,...N-1), scegli una seconda posizione a caso (j, nel range [0,N-1] - non hai nessuna limitazione in tal senso, la posizione si puo' trovare ovunque nel vettore, e non hai problemi legati al fatto che la stessa posizione potrebbe venir generata piu' volte) e scambi il contenuto delle due locazioni del vettore (v <-> v[j]).

    La soluzione di @adbin e' piu' arzigogolata, ma fondamentalmente fai la stessa cosa
  • Re: Creare coppie univoche di numeri

    Ho applicato entrambi i metodi da voi suggeriti
    Fa fede a quello che mi avete consigliato oppure sono fuoristrada?
    Li ho provati entrambi e funzionano bene.
    In sostanza con 40 numeri creo 20 coppie per 20 navi evitando qualsiasi ripetizione )
    
    import java.util.Scanner;
    import java.util.Random;
    
    public class principale01
    {
       public static final int nNavi = 20;
       public static final int nCoppie = 20;
         
      public static void main (String args[])
      {
        nave[] nave = new nave[nNavi] ; // Ho creato un array di oggetti di tipo "nave". ( 20 oggetti).
        int[] seminario = new int[nCoppie<<1]; // creo un'urna virtuale da dove prelevare tutti numeri generati casualmente dalla classe Random.
        int id = 0; // variabile contenente il valore casuale dell'indice di seminario.
     
        Random randomGenerator = new Random(); //creo un oggetto di tipo Random e di nome "randomGenerator" utilizzando la libreria Util.
    
    /************************************************************************************************/    
        System.out.println("1° metodo");
        //creo una sequenza ordinata di numeri da 0 a nCoppie ( per ottenere 20 coppie di numeri).
        for ( byte n=0; n<nCoppie; n++) seminario[n] = n;
        
        for (byte n=0; n<nNavi; n++) 
        { 
          //Genero casualmente il valore di indice id
          id = randomGenerator.nextInt(nCoppie<<1);
          //Creo un oggetto nave[n] assegnando al costruttore un valore casuale pari al valore di "seminario[id]",
          //quindi per il secondo valore scelgo l'ultimo nella lista, ma non ancora estratto.
          nave[n] = new nave(seminario[id],seminario.length-n);
        }
    /*************************************************************************************************/
        
        System.out.println("2° metodo");
        //  Popolo l'urna con una serie di numeri (i=0,,1,...N-1) per formare nCoppie
        for ( byte n=0; n<nCoppie<<1; n++) seminario[n] = n;
    
        for ( byte n=0; n<nNavi; n++) 
        {
          // Estraggo il secondo numero con una posizione a caso
          id = randomGenerator.nextInt(nCoppie<<1);
        
          //Swappo il valore dei due elementi (v[i] <-> v[j]).
          int tmp;
          tmp = seminario[n];
          seminario[n] = seminario[id];
          seminario[id] = tmp;
     
          // Quindi creo il nuovo oggetto "nave[]" con i valori sopra estratti.
          nave[n] = new nave(seminario[n],seminario[id]); // i valori vengono stampati dal costruttore.
        }  
      }  
    }
    
  • Re: Creare coppie univoche di numeri

    migliorabile ha scritto:


    La soluzione di @adbin e' piu' arzigogolata
    Non mi pare così "articolata" o strana. La complessità è similare al tuo scenario. Solo che nel tuo la complessità maggiore è tutta all'inizio, nel mescolamento. Nel mio invece è distribuita su ogni singola estrazione.
    Nel tuo ci sono sostanzialmente le stesse operazioni "scegli una seconda posizione a caso" (anche nel mio) e "scambi il contenuto delle due locazioni del vettore" (nel mio non c'è nemmeno uno "scambio" in senso stretto).
    Oltretutto uno potrebbe fare una classe (magari parametrabile) e usarla per creare numeri unici da es. 0 a 999, poi magari ne deve usare solo 100 di questi. Nel tuo caso li devi mescolare comunque tutti i 1000 all'inizio.
  • Re: Creare coppie univoche di numeri

    Ringrazio entrambi
Devi accedere o registrarti per scrivere nel forum
7 risposte