<?php

// 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;
}