随机编码的生成

距离上一次写博已过了好久。。也是有点偷懒了

今天带来不久前对优惠券编码的随机生成代码分享。

需求:给指定会员发放指定几种类型的优惠券,每类发一种

参数:会员ID、优惠券类型ID集合

生成规则:

系统时间随机生成数字- >5位

+会员ID(左填充0)     - >5位

    +类型ID      - >1位

    +随机5位之母插入以上生成的11位的不同位置

package com.**.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

public class CouponCodeAutoGenerate {

    public static CouponCodeAutoGenerate generate =null;
    private final static String NUM_CHAR = "0123456789";

    private static int charLen = NUM_CHAR.length();  

    private CouponCodeAutoGenerate(){

    }
    public static CouponCodeAutoGenerate getInstance(){
        if(generate ==null){
            generate =new CouponCodeAutoGenerate();
        }
        return generate;
    }

    public Map<Long,String> autoGenerateCouponCode(Long memberId,List<Long> idList){
        Map<Long,String> map =new HashMap<Long, String>();

        StringBuilder  sb =null;
        StringBuilder sbr =null;

        int[] intRet = null;

        int insertIndex =0;
        for(Long id :idList){
            sb=new StringBuilder();
            //系统时间 5位
            sb.append(getRandomByCurrentTime(5));
            //memberId 5位左填充0
            sb.append(String.format("%05d",memberId));
            //类型 1位
            sb.append(id);
            // 5个随机字母
            sbr=new StringBuilder(getRandChar(5));
            intRet =getRetIndex(5,sb.length()+1);

            for(int i=0;i<sbr.length();i++){
                insertIndex =intRet[i]+i;
                sb.insert(insertIndex, sbr.charAt(i));
            }

            map.put(id, sb.toString());
        }

        return map;
    }

    public String getRandChar(int s){
        String val ="";
        for(int i=0 ;i <s ;i++){
            Random random = new Random();
            int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; //取得大写字母还是小写字母
            val += (char) (choice + random.nextInt(26));
        }

        return val ;
    }

    public String getRandomByCurrentTime(int randomNumberDigit) {

         long seed = System.currentTimeMillis();// 获得系统时间,作为生成随机数的种子
          StringBuffer sb = new StringBuffer();// 装载生成的随机数
          Random random = new Random(seed);// 调用种子生成随机数
          for (int i = 0; i < randomNumberDigit; i++) {
             sb.append(NUM_CHAR.charAt(Math.abs(random.nextInt())% charLen));
          }  

        return sb.toString();

    }
    //替换位置
    //从0-t中取s个不同数字
    public int[] getRetIndex(int s,int t) {
        // TODO Auto-generated method stub
        int[] intRet = new int[s];
        int intRd = 0; //存放随机数
        int count = 0; //记录生成的随机数个数
        int flag = 0; //是否已经生成过标志

        while(count<s){
             Random rdm = new Random();
             intRd = Math.abs(rdm.nextInt())% t;
             for(int i=0;i<count;i++){
                 if(intRet[i]==intRd){
                     flag = 1;
                     break;
                 }else{
                     flag = 0;
                 }
             }
             if(flag==0){
                 intRet[count] = intRd;
                 count++;
             }
            }
        return intRet;
    }

    public static void main(String[] args) {
        List<Long> typeList =new ArrayList<Long>();
        typeList.add(1L);
        typeList.add(2L);
        typeList.add(3L);
        Map<Long,String> code =CouponCodeAutoGenerate.getInstance().autoGenerateCouponCode(23l, typeList);

        Set<Map.Entry<Long,String>> it =code.entrySet();

        for (Map.Entry<Long,String> entry : it) {
            System.out.println(entry.getKey()+"---"+entry.getValue());
        }

    }
}

 

时间: 2024-09-07 19:23:56

随机编码的生成的相关文章

js生成随机编码并赋值给input文本框

效果图如下: 页面代码: <div class="form-item form-width-in fr"> <label>产 品 编 码</label> <input type="text" id="product_code" name="product_code" value="" class="field fwidth" placeholde

Matlab生成M序列的伪随机码

伪随机编码中较常用的是m序列,它是线性反馈移位寄存器序列的一种,其特点是在相同寄存器级数的情况下输出序列周期最长.线性反馈移位寄存器的工作原理是,给定所有寄存器一个初始值,当移位脉冲到来时,将最后一级寄存器的值输出,同时将第 i级的寄存器内容存储到第 i+1 级中,此外将每一级的寄存器输出按照一定的线性运算规则计算出一个值,并将该值存入第一级寄存器中.随着移位脉冲的累加,线性反馈移位寄存器的输出可以组成一个序列,称之为移位寄存器序列[71]. 图3.5 线性反馈移位寄存器 MATLAB生成M序列

为产品或者商品随机生成6位数的数字编码方案

--为产品或者商品随机生成6位数的数字编码方案 --准备阶段 --建立一个表,生成100000到999999顺序编码 create table #no (  id int ) declare @id int  set @id=1 while(@id<=999999) begin  insert into #no values(@id)  set @[email protected]+1 end --建立随机编码表 create table RNo (  id int identity(1,1),

使用MyBatis Generator自动生成实体、mapper和dao层

通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:http://www.cnblogs.com/wangkeai/p/6934683.html第一种方式:main方法运行(推荐) 1.在pom.xml中加入插件依赖: 2.写mbgConfiguration.xml文件,jdbc.properties文件 3.写/SSM/src/main/java/main/Ge

iOS app打包 -- 生成ipa测试包 步骤详解

最近有小伙伴问我如何打成ipa包分发给测试人员 , 虽然现在网上的教程很多,但是也很杂, 没有一个比较完整的讲解. 利用工作之余, 就说一下如何生成ipa包?共分为两种方法. 第一种方法: 1) 至于配置发布证书和AdHoc描述文件, 就不再累述, 下载下来双击安装即可.(ps: 生成AdHoc描述文件的时候要注意勾选所有的设备, 只有被描述文件包含的设备才能进行相应的测试. 如果是企业账号的话则不需要添加设备的udid). 2) 接下来开始配置xCode里的工作(包括发布证书和描述文件), 注

微信生成二维码 只需一个网址即刻 还有jquery生成二维码

<div class="orderDetails-info"> <img src="http://qr.topscan.com/api.php?text=http://123.net/index.php?s=/Home/Index/yanzheng/mai/{$dange.id}" style="width: 5rem; margin-bottom: 1rem;" > </div> http://qr.tops

C# 动态生成WebService,无需添加引用

C#项目调用WebService是很常见的现象,但一旦修改链接地址就需要重新更新引用很是麻烦,这里跟大家分享一个通过地址,无需添加引用动态生成Webservice的小方法 方法类: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Channels

seam2.2根据已有数据库(postgresql)生成项目

首先呢,这是我向同哥请教的一个文题,然后同哥把整个过程给我解答了一遍,谢谢同哥的乃森及引针啦---- seam2.2根据已有数据库(postgresql)生成项目 一,建数据库 进入pgAdmin新建一个数据库然后用eclipse的插件ErMaster导出sql或者是自己手写sql新建数据表 ,这里新建了一个名为test的数据库 里面有两个表,member和department,为多对一的关系,注意不要忘了设置主键 二,进入seam目录运行 ./seam setup ./seam create-

AD 脚本kixtart运用之六(outlook邮件批量生成签名)

基于上一编文章http://windyma.blog.51cto.com/661702/1967071里的设置 我们在Function.kix添加如下内容(备注:此outlook签名function来自网上,经过我比较大的修改): ---------------- Function GenerateOutlookSig($SignatureFileName) $EmailAccountName = @WUSERID ;----获取outlook配置profile名字(如果有多个profile名字