要求

  • 不重复
  • 随机
  • 11位数字
  • 不占存储

我们都知道11位数字(random)对应有最大值max和最小值min99999999999和10000000000.很简单的从最小值开始按顺序分发到最大值,就满足了不重复,不占存储,11位数字的特性。那么接下来就要考虑如何生成随机数字这个特性?

如何随机

可以考虑将上面分发的11位id数字进行二进制打乱,就可以生成随机数字啦。但是呢打乱后的数字长度可能低于11位或者高于11位,那么如何有心机的进行二进制打乱才能保证固定11位呢。

11位数字(random) 不小于min

很自然的可以想到id从0到max-min分发再打乱再加上min肯定不会小于min,但是可能会大于max。

id数字特性

random:是要生成的随机数字 id:是顺序分发的数字

min=<random<=max   min=<min+id<=max  0=<id<=max-min
复制代码

11位数字(random) 不大于max

可以先观察一下max-min对应的二进制

1010011110100011010110000001111111111

如何进制顺序打乱不超过max-min,对于上面二进制除高位之外的第一个为1的位之后取最大值,即上述二进制变为(max_diff):

1001111111111111111111111111111111111

这样打乱顺序前三位保持不变,后面打乱就可以不超过max-min.我这里是低8位和除去前三位的高八位交换的。

使用率

变化后的二进制的使用率有:

max_diff/(max-min)=85899345919/89999999999=95.4%

The code

public class ShortChainUtils {private static final long MIN = 10000000000L;private static final long SUFFIX_ID = ((1L << 34) - 1);private static final long PRE_ID = (7L << 34);private static final long MAX_ID = 85899345919L;public static long next(long id) {if (id < 0 || id > MAX_ID) {throw new IllegalArgumentException("Illegal id: " + id);}// 非线性id = swap(id, 7, 0);id = swap(id, 6, 1);// Id后34位long value = id & SUFFIX_ID;// Id后34位的最低八位和高1-9位交换value = (((value >> 8) | ((value & 255) << 26)));// Id前3位|Id后34位id = (id & PRE_ID) | value;// 加上最小值, 保证生成的11位id += MIN;return id;}/*** xxxx xxxx xxxx x0xx xxxx xx0x xxxx xxxx|0000 0000 0000 0b00 0000 00a0* 0000 0000*/private static long swap(long value, int x, int y) {return (value & (~(1 << x)) & (~(1 << y))) | (((value >> x) & 1) << y) | (((value >> y) & 1) << x);}private ShortChainUtils() {};public static void main(String[] args){Set set = new HashSet();for(int i=0;; i++) {long id = ShortChainUtils.next(i);System.out.println(id +"---"+i);if(set.contains(id)){System.out.println("duplicated");break;}set.add(id);}}复制代码

不重复id

对于不重复id的分发可以参考:

自增ID的实现

总结

该随机数字算法生成简单,效率高,容易扩展(比如你想生成8位,9位可以用类似方法),不用记录已生成数字去重。

另外还要注意一点的是,要想随机数字不重复,重点是ID分发不重复。

如何生成随机不重复的11位数字相关推荐

  1. python输出姓名_Python生成随机不重复姓名昵称

    姓采用百家姓,名字从常用名字高频字选取两个汉字,再和当前时间戳组合,估计应该是不会重复了,代码如下: # -*- coding:utf-8 -*- import random import time ...

  2. js生成随机不重复数字的几种方法

    三种方式实现生成随机不重复数字: <!DOCTYPE html> <html> <head><title>生成随机不重复数</title> ...

  3. python组成不重复的三位数是多少_超星Python 练习实例1-组成多少个互不相同且无重复的三位数字...

    数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码: #!/u ...

  4. input输入框只能输入11位数字

    input输入框只能输入11位数字 <input type="number" οninput="if(value.length>11)value=value. ...

  5. 请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码

    请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码 出现这个问题按照提示上的来看应该是手机号码输入的不对 但是输入的手机号码的确是11位 这个手机号是开发者账号绑定的手机号 也就 ...

  6. 苹果开发者账号renew时出现“请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码”

    苹果开发者账号到期,renew时在提交订单时在手机号一栏中出现以下报错: 请输入有效的11位数字手机号码,或者包含区号的11位或12位数字座机号码 因为解决问题后才想起要写个博客告诉遇到这个问题的小伙 ...

  7. Python 随机生成11位数字(电话号码)

    随机生成11位电话号码 import randomdef raddomPhone():headList = ["130", "131", "132&q ...

  8. 关于生成随机不重复号码的算法迭代过程

    业务需求 调用服务需要生成一个随机的.不重复的8位数以内的号码. 方案一: 号码池 当看到需求时,首先想到的是采用号码池来实现. 实现方式 初始化阶段就先将所有的8位数以内的号码生成号,然后进行随机打 ...

  9. Java生成随机不重复推广码邀请码

    欢迎进入我的博客:blog.scarlettbai.com查看更多文章 最近接到一个需求,要批量生成推广码,首先我们知道推广码的特效有如下两点: 1:不可重复 2:不可以被推测出 关于这两点,我们的思 ...

最新文章

  1. sql入门经典第5版pdf网盘_如何学习 SQL 语言?
  2. 优秀自我简介200字_全球战疫 翰墨传情——东方盛世杯网络公益书画展优秀作品【二】...
  3. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰
  4. 如何 tune spark jobs
  5. spark指定类型+列名 将RDD转化成DataFrame
  6. LeetCode Can I Win
  7. 新上手的Mac怎么开始盘?
  8. 详解MySQL的用户密码过期功能
  9. 《软件需求十步走》阅读笔记6
  10. ubuntu安装visio2010_ubuntu 一个Linux脚本搞定常用软件的安装
  11. Mean-shift超像素分割
  12. 机房黑科技:京东数科机房巡检机器人
  13. 巧用批处理cmd快速切换IP地址
  14. PDF在线转换成word免费版
  15. html文字抖动效果,CSS实现TikTok文字抖动效果示例
  16. javaSe探赜索隐IO--File
  17. 西工大机考《房地产法》大作业网考
  18. 快速了解矢量量化Vector-Quantized(VQ)及相应代码
  19. 大数据说:原来“首堵”不是北京!
  20. Linux问题:Cannot prepare internal mirrorlist: No URLs in mirrorlist

热门文章

  1. 图像分割——基于二维灰度直方图的阈值处理
  2. 算法中的Strassen矩阵乘法
  3. Qt创建工程及导入资源图片
  4. COLLEGE.sql(复制的时候注意路径!!!)
  5. uva 12563——Jin Ge Jin Qu hao
  6. 多益网络 视频面试面试总结20180816
  7. 《凡人修仙传》中打斗场景(c++多态实现)
  8. C++ array初始化需要双层大括号
  9. 成为C++高手之实战项目
  10. netstat 相关命令解析