se ti può servire questa l'ho fatto un po di tempo fa, ma fa ancora il suo lavoro:

Codice PHP:
function generaCodiceCasuale($a=5,$livello=2){
$casual="";

for(
$i=0;$i<$a;$i++){//determina di quante lettere sarà la password
    
$mom=mt_rand(0,$livello);//maiuscolo, minuscolo o numero
 
    
switch ($mom){
      case 
0:
          
$casual .=chr(mt_rand(65,90));  /// Lettere Maiuscole
          
break;
      case 
1:
          
$casual .=chr(mt_rand(97,122)); ////Lettere Minuscole
          
break;
      case 
2:
          
$casual .=mt_rand(0,9); ///// Numeri
          
break;
      case 
3:
          
$casual .=chr(mt_rand(33,47)); ///// Caratteri speciali
          // ! " # $ % & ' ( ) * + , - . /
          
break;
      case 
4:
          
$casual .=chr(mt_rand(58,64)); ///// Caratteri speciali
          // : ; < = > ? @
          
break;
    }
//chiusura swicth
}//chiusura ciclo for

return $casual;