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

  • 相关阅读:
    221. 最大正方形
    9. 回文数
    2. 两数相加
    1. 两数之和
    HDU 1864 最大报销额
    47 java包打成本地maven
    46 数组中的元素进行位置交换
    5 docker安装kibana
    45 vue图片放大预览
    4 docker中安装es
  • 原文地址:https://www.cnblogs.com/shindo/p/5995849.html
Copyright © 2011-2022 走看看