Eventualmente, é preciso gerar sequências randômicas em sistemas de informação. Alguns exemplos comuns são: geração de arquivo ou diretório com nome único; geração de sal para senhas; geração de chaves de sessão; geração de textos para captcha; etc.
Para tanto, a forma mais comum de se gerar uma sequência randômica é utilizando a função rand ou a versão melhorada dela, chamada mt_rand. Ambas funcionam da mesma maneira. Particularmente, não sei por que criaram outra função para o mesmo propósito, em todo caso, melhor usar mt_rand.
A função recebe um valor mínimo e máximo e devolve um número inteiro dentro do intervalo proposto (inclusive extremidades).
Para gerar uma sequência randômica, é preciso definir um alfabeto a ser usado e um tamanho desejado. Por exemplo, uma sequência apenas com números, sequência com números e letras, sequência com símbolos, etc. Com o alfabeto em uma variável, e um tamanho desejado, basta escolher randomicamente cada uma das posições da sequência. O mínimo e máximo devem ser de zero até o tamanho do alfabeto menos um. Veja um exemplo:
// Preparando as caracteristicas da sequencia randomica
$tamanho = 8;
$alfabeto = 'abcdefghijklmnopqrstuvwxyz0123456789';
$minimo = 0;
$maximo = strlen($alfabeto) - 1;
// Gerando a sequencia
$sequencia = '';
for ($i = $tamanho; $i > 0; --$i) {
// Sorteando uma posicao do alfabeto
$posicao_sorteada = mt_rand($minimo, $maximo);
// Obtendo o simbolo correspondente do alfabeto
$caractere_sorteado = $alfabeto[$posicao_sorteada];
// Incluindo o simbolo na sequencia
$sequencia .= $caractere_sorteado;
}
// Sequencia pronta
echo $sequencia;
A função abaixo permite que escolher alguns alfabetos pré-definidos:
// Mascaras binarias
define('RANDOM_MAIUSCULAS', 1); // 0001
define('RANDOM_MINUSCULAS', 2); // 0010
define('RANDOM_LETRAS', 3); // 0011
define('RANDOM_NUMEROS', 4); // 0100
define('RANDOM_ALFANUM', 7); // 0111
define('RANDOM_SIMBOLOS', 8); // 1000
define('RANDOM_COMPLETO', 15); // 1111
/**
* Gera uma sequencia de simbolos randomicos
* @param int $tamanho Tamanho da string retornada
* @param int $simbolos Mascara binaria dos tipos de simbolos usados
* @return string Sequencia de simbolos randomicos
*/
function random($tamanho = 10, $simbolos = RANDOM_ALFANUM) {
if (!$simbolos) {
trigger_error('Simbolos invalido', E_USER_ERROR);
return false;
}
$str = '';
if ($simbolos & RANDOM_MAIUSCULAS) {
$str .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
if ($simbolos & RANDOM_MINUSCULAS) {
$str .= 'abcdefghijklmnopqrstuvwxyz';
}
if ($simbolos & RANDOM_NUMEROS) {
$str .= '0123456789';
}
if ($simbolos & RANDOM_SIMBOLOS) {
$str .= '?!@#$%&*()[]{}<>_+-=;:,.';
}
$str = str_shuffle($str);
$ultimo = strlen($str) - 1;
$saida = '';
for ($i = abs($tamanho); $i > 0; --$i) {
$saida .= $str[mt_rand(0, $ultimo)];
}
return $saida;
}
Exemplos de uso:
// Geracao de uma sequencia de 30 simbolos com letras maiusculas $r = random(30, RANDOM_MAIUSCULAS); // Geracao de uma sequencia de 10 simbolos com letras minusculas e numeros $r2 = random(10, RANDOM_MINUSCULAS | RANDOM_NUMEROS);
4 comentários
Muito bom Rubens. Obrigado.
E pra gerar todas as combinações(diferentes) possíveis, de 3 letras(somente),minúsculas do alfabeto?
Douglas, se são só 3 letras, é só fazer 3 loops encadeados, percorrendo um array com as letras do alfabeto.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com