zoukankan      html  css  js  c++  java
  • Java随机数生产算法

    java提供了Math.random()函数,返回一个double类型的随机数,也有util包里的Random类,可以生成double,int,float,long,bytes等随机数。

    但有些业务需求,往往需要对这些方法做一下封装。比如用固定因子生成32位的3DES算法key值。

    下面提供一些封装的方法:

    package test;
    
    import java.util.Random;
    
    public class RandomUtil {
    
        public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        public static final String NUMBERCHAR = "0123456789";
    
        /** 
         * 返回一个定长的带因子的固定的随机字符串(只包含大小写字母、数字)
         *  
         * @param length 
         *            随机字符串长度 
         * @return 随机字符串 
         */
        public static String generateStringByKey(int length, int channel) {
            StringBuffer sb = new StringBuffer();
            Random random = new Random(channel);
            for (int i = 0; i < length; i++) {
                sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
            }
            return sb.toString();
        }
    
        /** 
         * 返回一个定长的随机字符串(只包含大小写字母、数字)
         *  
         * @param length 
         *            随机字符串长度 
         * @return 随机字符串 
         */
        public static String generateString(int length) {
            StringBuffer sb = new StringBuffer();
            Random random = new Random();
            for (int i = 0; i < length; i++) {
                sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
            }
            return sb.toString();
        }
    
        /** 
         * 返回一个定长的随机纯字母字符串(只包含大小写字母) 
         *  
         * @param length 
         *            随机字符串长度 
         * @return 随机字符串 
         */
        public static String generateMixString(int length) {
            StringBuffer sb = new StringBuffer();
            Random random = new Random();
            for (int i = 0; i < length; i++) {
                sb.append(ALLCHAR.charAt(random.nextInt(LETTERCHAR.length())));
            }
            return sb.toString();
        }
    
        /** 
         * 返回一个定长的随机纯大写字母字符串(只包含大小写字母) 
         *  
         * @param length 
         *            随机字符串长度 
         * @return 随机字符串 
         */
        public static String generateLowerString(int length) {
            return generateMixString(length).toLowerCase();
        }
    
        /** 
         * 返回一个定长的随机纯小写字母字符串(只包含大小写字母) 
         *  
         * @param length 
         *            随机字符串长度 
         * @return 随机字符串 
         */
        public static String generateUpperString(int length) {
            return generateMixString(length).toUpperCase();
        }
    
        /** 
         * 生成一个定长的纯0字符串 
         *  
         * @param length 
         *            字符串长度 
         * @return 纯0字符串 
         */
        public static String generateZeroString(int length) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < length; i++) {
                sb.append('0');
            }
            return sb.toString();
        }
    
        /** 
         * 根据数字生成一个定长的字符串,长度不够前面补0 
         *  
         * @param num 
         *            数字 
         * @param fixdlenth 
         *            字符串长度 
         * @return 定长的字符串 
         */
        public static String toFixdLengthString(long num, int fixdlenth) {
            StringBuffer sb = new StringBuffer();
            String strNum = String.valueOf(num);
            if (fixdlenth - strNum.length() >= 0) {
                sb.append(generateZeroString(fixdlenth - strNum.length()));
            } else {
                throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常!");
            }
            sb.append(strNum);
            return sb.toString();
        }
    
        /** 
         * 每次生成的len位数都不相同 
         *  
         * @param param 
         * @return 定长的数字 
         */
        public static int getNotSimple(int[] param, int len) {
            Random rand = new Random();
            for (int i = param.length; i > 1; i--) {
                int index = rand.nextInt(i);
                int tmp = param[index];
                param[index] = param[i - 1];
                param[i - 1] = tmp;
            }
            int result = 0;
            for (int i = 0; i < len; i++) {
                result = result * 10 + param[i];
            }
            return result;
        }
    
        public static void main(String[] args) {
            int channel = 555555;// 测试因子比生产因子少1
            System.out.println("返回一个定长的带因子的固定的随机字符串(只包含大小写字母、数字):" + generateStringByKey(32, channel));
            System.out.println("返回一个定长的随机字符串(只包含大小写字母、数字):" + generateString(32));
            System.out.println("返回一个定长的随机纯字母字符串(只包含大小写字母):" + generateMixString(10));
            System.out.println("返回一个定长的随机纯大写字母字符串(只包含大小写字母):" + generateLowerString(10));
            System.out.println("返回一个定长的随机纯小写字母字符串(只包含大小写字母):" + generateUpperString(10));
            System.out.println("生成一个定长的纯0字符串:" + generateZeroString(10));
            System.out.println("根据数字生成一个定长的字符串,长度不够前面补0:" + toFixdLengthString(123, 10));
            int[] in = { 1, 2, 3, 4, 5, 6, 7 };
            System.out.println("每次生成的len位数都不相同:" + getNotSimple(in, 3));
        }
    }

    运行效果如下:

    引用:http://blog.csdn.net/yaerfeng/article/details/18362623

  • 相关阅读:
    JS防止刷新,后退,关闭
    IIS日志-网站运维的好帮手
    未能加载文件或程序集“XXX”或它的某一个依赖项。磁盘空间不足---解决方案
    NOPI导出标准格式Excel
    DRBD+Heartbeat+Mysql高可用环境部署
    LVS三种包转发模型调度算法
    nagios环境部署(rhel6.5)
    关于nagios监控
    关于memcached原理及安装部署
    PHP5.4.36 RHEL6.5 源码编译安装
  • 原文地址:https://www.cnblogs.com/shindo/p/5995849.html
Copyright © 2011-2022 走看看