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