- Codice: Seleziona tutto
public class Nodo {
private static int tot = 0; // numero dei nodi (solo per debug)
private int num; // numero del nodo (debug)
private int cx; // coordinata orizzontale
private int cy; // coordinata verticale
private static Vector<Integer> ascisse = new Vector<Integer>(); // ascisse gia' usate
private static Vector<Integer> ordinate = new Vector<Integer>(); // ordinate gia' usate
private Random random = new Random();
/**
* Costruttore.
*/
public Nodo() {
// imposto le coordinate impedendo nodi sovrapposti
boolean condx, condy;
do {
condx = condy = false;
this.cx = random.nextInt(101);
condx = ascisse.contains(this.cx);
if (!condx) {
ascisse.addElement(this.cx); // non e' mai stata usata questa ascissa: la aggiungo
}
this.cy = random.nextInt(101);
condy = ordinate.contains(this.cy);
if (!condy) {
ordinate.addElement(this.cy); // non e' mai stata usata questa ordinata: la aggiungo
}
System.out.println("condx && condy: " + (condx && condy));
} while (condx && condy); // entrambe le coordinate gia' usate, ripeto la procedura
// this.cx = (int) (Math.random() * 100);
// this.cy = (int) (Math.random() * 100);
this.num = tot;
tot++;
System.out.println("Creato nodo " + this.num + " (" + this.cx + "," + this.cy + ")");
}
}
Questo codice funziona senza nessuna difficoltà, se non quando arriva sui 140-150 nodi generati, dove la guardia del while (condx && condy) restituisce sempre TRUE e quindi il ciclo non si ferma... La condizione si verifica in quanto sia l'ascissa che l'ordinata del punto che devo creare sono già state utilizzate... Ora, questi nodi si inseriscono in un grafico di 100x100 interi, il che vuol dire 10000 nodi possibili senza sovrapposizioni (matematica di base). Il fatto che il programma entri in loop dopo soli 150 nodi mi porta a pensare a pensare che la funzione Random.next(101) faccia un po' schifo come generatrice di numeri... Ipotesi affermata anche dal fatto che se commento il ciclo e decommento le due righe subito sotto (ovvero tolgo il vincolo di non avere elementi sovrapposti) il programma funziona come si deve.
La mia domanda è: esiste un modo per potenziare la funzione Random.next(101) in modo che mi restituisca numeri molto più variabili?
E se non c'è, avete soluzioni alternative?
Grazie a tutti!


la mia implementazione faceva davvero schifo! Ho risolto come segue: