| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | <?phpnamespace fast;/** * 随机生成类 */class Random{    /**     * 生成数字和字母     *     * @param int $len 长度     * @return string     */    public static function alnum($len = 6)    {        return self::build('alnum', $len);    }    /**     * 仅生成字符     *     * @param int $len 长度     * @return string     */    public static function alpha($len = 6)    {        return self::build('alpha', $len);    }    /**     * 生成指定长度的随机数字     *     * @param int $len 长度     * @return string     */    public static function numeric($len = 4)    {        return self::build('numeric', $len);    }    /**     * 生成指定长度的无0随机数字     *     * @param int $len 长度     * @return string     */    public static function nozero($len = 4)    {        return self::build('nozero', $len);    }    /**     * 能用的随机数生成     * @param string $type 类型 alpha/alnum/numeric/nozero/unique/md5/encrypt/sha1     * @param int    $len  长度     * @return string     */    public static function build($type = 'alnum', $len = 8)    {        switch ($type) {            case 'alpha':            case 'alnum':            case 'numeric':            case 'nozero':                switch ($type) {                    case 'alpha':                        $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';                        break;                    case 'alnum':                        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';                        break;                    case 'numeric':                        $pool = '0123456789';                        break;                    case 'nozero':                        $pool = '123456789';                        break;                }                return substr(str_shuffle(str_repeat($pool, ceil($len / strlen($pool)))), 0, $len);            case 'unique':            case 'md5':                return md5(uniqid(mt_rand()));            case 'encrypt':            case 'sha1':                return sha1(uniqid(mt_rand(), true));        }    }    /**     * 根据数组元素的概率获得键名     *     * @param array $ps     array('p1'=>20, 'p2'=>30, 'p3'=>50);     * @param int   $num    默认为1,即随机出来的数量     * @param bool  $unique 默认为true,即当num>1时,随机出的数量是否唯一     * @return mixed 当num为1时返回键名,反之返回一维数组     */    public static function lottery($ps, $num = 1, $unique = true)    {        if (!$ps) {            return $num == 1 ? '' : [];        }        if ($num >= count($ps) && $unique) {            $res = array_keys($ps);            return $num == 1 ? $res[0] : $res;        }        $max_exp = 0;        $res = [];        foreach ($ps as $key => $value) {            $value = substr($value, 0, stripos($value, ".") + 6);            $exp = strlen(strchr($value, '.')) - 1;            if ($exp > $max_exp) {                $max_exp = $exp;            }        }        $pow_exp = pow(10, $max_exp);        if ($pow_exp > 1) {            reset($ps);            foreach ($ps as $key => $value) {                $ps[$key] = $value * $pow_exp;            }        }        $pro_sum = array_sum($ps);        if ($pro_sum < 1) {            return $num == 1 ? '' : [];        }        for ($i = 0; $i < $num; $i++) {            $rand_num = mt_rand(1, $pro_sum);            reset($ps);            foreach ($ps as $key => $value) {                if ($rand_num <= $value) {                    break;                } else {                    $rand_num -= $value;                }            }            if ($num == 1) {                $res = $key;                break;            } else {                $res[$i] = $key;            }            if ($unique) {                $pro_sum -= $value;                unset($ps[$key]);            }        }        return $res;    }    /**     * 获取全球唯一标识     * @return string     */    public static function uuid()    {        return sprintf(            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',            mt_rand(0, 0xffff),            mt_rand(0, 0xffff),            mt_rand(0, 0xffff),            mt_rand(0, 0x0fff) | 0x4000,            mt_rand(0, 0x3fff) | 0x8000,            mt_rand(0, 0xffff),            mt_rand(0, 0xffff),            mt_rand(0, 0xffff)        );    }}
 |