Newsgroup: it.comp.java
Titolo: generatore di password uguali

La seguente classe mi stampa 10 password uguali mentre io vorrei che
venissero stampate 10 password differenti.
dove ho sbagliato
 [CODE]
import java.util.*;
public class PwdGenerator {
	public static void main(String[] args)
	{	
		String pwdGenerata = "";
		PwdGenerator pg=new PwdGenerator();
		for (int i=1;i<=10;i++) 
		{
			pwdGenerata=pg.getPWD();
			System.out.println("pwd:"+pwdGenerata);
 
		}
 
 
	}
    public PwdGenerator() {
 
    }
 
 
 
    public static String getPWD() {
        Random rnd = new Random();
        //decido dimensione password
        int dim = rnd.nextInt(5);
        dim = dim+6;
        //decido la quantità di cifre numeriche
        int num = rnd.nextInt(dim-4)+1;
        num= num+2;
        //decido la quantità di cifre alfa
        int alfa = dim-num;
        int appoggio=0;
        String pass="";
        int alterna=0;
        int contnum=1;
        int contalfa=1;
        for (int i=1;i<=dim;i++) {
            alterna = rnd.nextInt(2);
            if (contalfa>alfa){alterna=0;}
            else{if (contnum>num) {alterna=1;}
            }
            if (alterna==1) {contalfa++;
            appoggio = rnd.nextInt(25);
				switch (appoggio) {
					case 0 : pass = pass+"A";break;
					case 1 : pass = pass+"B";break;
					case 2 : pass = pass+"C";break;
					case 3 : pass = pass+"D";break;
					case 4 : pass = pass+"E";break;
					case 5 : pass = pass+"F";break;
					case 6 : pass = pass+"G";break;
					case 7 : pass = pass+"H";break;
					case 8 : pass = pass+"I";break;
					case 9 : pass = pass+"J";break;
					case 10 : pass = pass+"K";break;
					case 11 : pass = pass+"L";break;
					case 12 : pass = pass+"M";break;
					case 13 : pass = pass+"N";break;
					case 14 : pass = pass+"O";break;
					case 15 : pass = pass+"P";break;
					case 16 : pass = pass+"Q";break;
					case 17 : pass = pass+"R";break;
					case 18 : pass = pass+"S";break;
					case 19 : pass = pass+"T";break;
					case 20 : pass = pass+"U";break;
					case 21 : pass = pass+"W";break;
					case 22 : pass = pass+"X";break;
					case 23 : pass = pass+"Y";break;
					case 24 : pass = pass+"Z";break;
				}
            }
            if (alterna==0) {contnum++;
            appoggio = rnd.nextInt(10);
				switch (appoggio) {
					case 0 : pass = pass+"0";break;
					case 1 : pass = pass+"1";break;
					case 2 : pass = pass+"2";break;
					case 3 : pass = pass+"3";break;
					case 4 : pass = pass+"4";break;
					case 5 : pass = pass+"5";break;
					case 6 : pass = pass+"6";break;
					case 7 : pass = pass+"7";break;
					case 8 : pass = pass+"8";break;
					case 9 : pass = pass+"9";break;
				 }
            }
        }
 
        return pass;
    }
 
}
[/CODE]

 dove ho sbagliato
 
Non vorrei dirti una cazzata ma credo che tu abbia chiuso il ciclo for
subito dopo il primo else, mentre dovrebbe essere chiuso dopo l'ultimo
switch.


 venissero stampate 10 password differenti. dove ho sbagliato
Prova a sostituire queste due righe:
-----
public static String getPWD() {
	Random rnd = new Random();
-----
con queste altre:
-----
Random rnd = new Random();
public String getPWD() {
-----
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html#Random()
-- 
Njc

ok grazie, penso di aver capito dove stava l'errore(apparte static
nella dichiarazione del metodo), o almeno penso(corregggetemi pure):
come avevo fatto io creavo più istanze della Classe Random usando
sempre lo stesso 'seme' e generando quindi la stessa sequenza di
numeri casuali.
meglio quindi


ok grazie, penso di aver capito dove stava l'errore(apparte static
nella dichiarazione del metodo), o almeno penso(corregggetemi pure):
come avevo fatto io creavo più istanze della Classe Random usando
sempre lo stesso 'seme' e generando quindi la stessa sequenza di
numeri casuali.
meglio quindi
Random rnd = new Random();
public String getPWD() {

 numeri casuali.
Esatto!
La questione dello "static" è solo una scelta; visto che usi le funzionalità
di PwdGenerator tramite una sua istanza, allora puoi togliere lo static.
Se invece vuoi usarlo come generatore globale, puoi rimettere gli static (ad
entrambi, altrimenti non è coerente... e non compila):
static Random rnd = new Random();
public static String getPWD() {
e in questo modo puoi usare il generatore tramite una «chiamata alla
classe», senza creare l'oggetto:
PwdGenerator.getPwd();
Pero' attenzione ad usare gli static in condizioni di multi-threading,
potresti creare delle race conditions, se non fai uso di sincronizzazioni.
-- 
Njc

...
