Dividas na geração de Numeros aleatorios

Bom dia amigos, estou com um problema para resolver mais sou novo no mundo da programação em java e estou tendo dificuldades

gostaria que os amigos apenas comentassem este codigo que eu peguei em outro topico, se apenas comentarem dizendo oq cada variavel faz por exemplo ja me ajudariam muito.

segue o Codigo a baixo:

[code]public class megaSena {

	    public static void main(String[] args) {
	    
	    	Scanner sorte = new Scanner(System.in);
	        int qtdCartelas = 10;
	        int qtdDezenas = 6;
	        String jogo;
	        String resultado = "";
	        String s = "";
	        int x = 1;
	        int dezena;
	        int qtde = 1;
	        double num = 0;
	        System.out.println("Digite a Quantidade de Jogos: ");
	        qtdCartelas = sorte.nextInt();
	      

	        while(qtde < qtdCartelas){
	            jogo="";
	            x = 1;

	            while(x <=qtdDezenas){
	            	
	                num = Math.random();
	                s = String.valueOf(num);
	                s = s.substring(6,8).trim();
	                dezena = Integer.valueOf(s);

	                if(dezena >=1 && dezena <=60 && !jogo.contains(s)){
	                    jogo = jogo+"-"+String.valueOf(dezena);
	                    
	                }

	            }
	            resultado = resultado+"\n"+jogo;

	            qtde++;

	        }
	        System.out.println(resultado);
	        }
	  	}

[/code]

Para você entender não adianta comentar o código. É mais fácil você perguntar quais são as suas duvidas sobre o código. Aconselho também a escrever seu próprio código. Só assim você vai conseguir entender.

Gleidson, boa tarde! Tudo bem com você?

Segue conforme solicitado. Eu fiz alterações em função de algumas inconsistências no aplicativo. Sinceramente eu não consegui compreender qual é real objetivo desse aplicativo, mas está funcionando.
Ele pode ser melhorado, principalmente no quesito de O.O. e poderia ser aplicada uma lógica de programação mais assertiva. Eu decidi deixa-lo mais próximo da versão enviada por você. Espero que eu possa ajuda-lo com seus estudos. Boa sorte.

import java.util.Scanner;// Foi necessário incluir essa linha, em função do uso do método "NextInt"

//Declaração de classe
public class MegaSena { 

	//Declaração do método main
	public static void main(String[] args) 
	{ 

		//Cria um objeto do tipo Scanner para receber dados digitados em tela.
		Scanner sorte = new Scanner(System.in); 

		//OBS:Iniciar com valor 10. Mas quando executa( qtdCartelas = sorte.nextInt ) valor é sobrescrito.
		//Penso que não faz sendito começar com valor padrão uma vez que ele será informado em seguida.
		int qtdCartelas = 10; //Captura dados em tela digitado pelo usuáro e Referência para primeiro while
		int qtdDezenas = 6;   //Referência para segundo while
	
		//Declaração de variáveis do tipo String
		String jogo;            //Recebe valores dentro do IF
		String resultado = "";  //Recebe valores da variável (jogo) 
		String s;               //Recebe valores aleatórios convertidos em String
		String s1;			    //Recebe os dois últimos dígitos de num( que gera valores aleatórios )
	
		//Declaração de variáveis do tipo int
		int x = 1;      //Contador para segundo while
		int dezena=1;   //Recebe os dois últimos dígitos de num( que gera valores aleatórios )
		int qtde = 1;   //Contador que não tem função no aplicativo
	
		double num = 0; //Recebe sequência de números aleatórios de 0 até 0.999
	
		//Recebe quantidade de cartelas. Registro é informado pelo usuário.
		System.out.print("Digite a Quantidade de Jogos: "); 
		qtdCartelas = sorte.nextInt(); //Recebe valor digitado pelo usuário, graças declaração do ( import java.util.Scanner )

		//Executa até que ( qtde ) seja menor que qtdCartelas( Valor esse informado pelo usuário )
		while( qtde < qtdCartelas )
		{ 		
			jogo=""; 	
	    	x = 1; 
		
			//Executa até que x( Valor fixo 1 ) seja menor que qtdDezenas( valor fixo 6 )
			while( x <= qtdDezenas )
			{ 
				//Método "random" da classe Math: gera um número aleatório de 0 até 0.9999 
				num = Math.random(); 
			
				//Coverte Double para String
				s = String.valueOf( num ); 			
								
				//Impressão a partir do índice 16 da String
				//Mudei de 6 para 16 porque você converte (dezena) para inteiro,
				//Se tivesse mantido 6 haveria estouro na variável integer
				//Assim vamos pegar sempre os dois últimos dígitos de num
				s1 =  s.substring( 16 );
			
				//Recebe sequência de números a partir do dígito 16			
				dezena = Integer.valueOf( s1 );			
		
				//Executa somente se dezena estiver entre 1 e 60 e que 
				//Em (jogos) não tenha número dezena			
				if( dezena >= 1 && dezena <=60 && !jogo.contains( s ) )
				{ 
					jogo += "-" + String.valueOf( dezena ); 
				}
			
				x++;//Fiz inclusão dessa atribuição para que while seja encerrado 

			} //Fim do segundo while
	
			resultado = jogo; //(resultado) recebe jogo. 
			qtde++; //Atribui valor na variável (qtde). Não entendi por quê foi feira essa atribuiçao??
	
		}//Fim do primeiro while 
	
		//Impressão da variável (Resutado)
		System.out.printf( "Resultado:%s", resultado );  
		
	}//Fim do método main 

}//Fim classe