Math.random()

Bem estou tentando entender como o método QuickSort funciona, bem já entendi quase tudo,irei deixar o código logo abaixo do algoritimo que eu
estou estudando

 import javax.swing.JOptionPane;
 
 
 public class Quick 
 {
 	   
 	/*----------------------------------------------------------------------*/
 	/* Ordena uma rray pelo método QuickSort (recursivo).                    */
 	/* Escolhe o pivô da partição aleatoriamente para minimizar proba-      */
 	/* bilidade de tamanhos muito diferentes das duas metades do ARRAY.     */
 	/* Rearranja o array de tal modo que:                                   */
 	/* Elementos da primeira metade sejam menores que o pivô                */
 	/* Elementos da segunda  metade sejam maiores que o pivô                */
 	/* Parâmetros: array, índices do início e fim do subarray.              */
 	/*----------------------------------------------------------------------*/
 	  private static void ordena(int a[], int p, int u) 
 	  {
 	    int i = p, f = u;                        // Extremos
 	    int x = (int) (Math.random()*(u-p+1))+p; // Aleatório
 	    int pivô = a[x];                         // para evitar quadrático
 	    
 	    while (i <= f) 
 	    {                         // Enquanto não se cruzarem
 	      
 	      while (i < u && a[i] < pivô) i++;      // Organiza primeira metade
 	      
 	      while (f > p && a[f] > pivô) f--;      // Organiza segunda metade
 	      
 	      if (i <= f) {                          // Se ainda não acabou
 	        x = a[f];                            // troca os elementos
 	        a[f--] = a[i];                       // dos dois lados
 	        a[i++] = x;                          // da lista
 	      }
 	    }
 	    
 	    if (p < f) ordena(a,p,f);                // a[p]..a[f] < pivô
 	    if (i < u) ordena(a,i,u);                // a[i]..a[u] > pivô
 	  }
 	  
 	  public static void main(String args[])
 	  {
 		  int vet[] = new int [10];
 		  int i;
 		  
 		  for(i=0;i<vet.length;i++)
 		  {
 			  vet[i]=Integer.parseInt(JOptionPane.showInputDialog("Dígite o "+(i+1)+"° número"));
 			  ordena(vet);
 		  }
 	  }
 	/*----------------------------------------------------------------------*/
 	/* Chamada do usuário (mesma para todos os algoritmos).                 */
 	/*----------------------------------------------------------------------*/
 	 
 
 
 }

bem quero que vcs me ajudem nesta parte:

não entendi como é feita a escolha… pesquisei na API sobre Math.random
sei que ele retorna um valor double e utiliza casting para transforma o valor que está em double em int mas se eu quizer por exemplo um valor somente entre 10 e 5 como ficaria…?? e no algoritimo porque Math.random() multiplica (u-p+1)+p…?? e para escolher valores não repetidos??? alguém sabe?? e também u e p, no meu algoritimo não muda os valores pois u e p são valores constantes…

Olá!

A idéia desse tipo de coisa dentro do Math.random() é determinar um valor mínimo e um valor máximo para os números que serão gerados…

Se suas variáveis u e p nunca mudam, defina-as como final (constantes). Quando vc quiser alterar o limite para os quais os números aleatórios são gerados, é só alterar essas variáveis, não precisa caçar a inicialização do random no código!

Abraço!