如何生成随机不重复的11位数字

要求

  • 不重复
  • 随机
  • 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分发不重复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因为你的电脑安装了即点即用_即你所爱

因为你的电脑安装了即点即用Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and …

关于前端缓存问题

Cookie、localStorage、sessionStorage的异同 之前没怎接触过前端缓存&#xff0c;请教了前端同事之后他给我粘了几行代码&#xff0c;用localStorage存取信息&#xff0c;后来老大review代码的时候发现&#xff0c;被批了一顿&#xff0c;现在好好看看这几个前端缓存的区别&am…

2074. 反转偶数长度组的节点

2074. 反转偶数长度组的节点 给你一个链表的头节点 head 。 链表中的节点 按顺序 划分成若干 非空 组&#xff0c;这些非空组的长度构成一个自然数序列&#xff08;1, 2, 3, 4, …&#xff09;。一个组的 长度 就是组中分配到的节点数目。换句话说&#xff1a; 节点 1 分配给…

阿里云云服务器硬盘分区及挂载

云服务器环境&#xff1a;CentOS 6.2 64位 客户端环境&#xff1a;Mac OSX 远程连接方式&#xff1a;运行 Terminal&#xff0c;输入命令 ssh usernameip 硬盘分区及挂载操作步骤&#xff1a; 查看未挂载的硬盘&#xff08;名称为/dev/xvdb&#xff09;fdisk -l Disk /dev/xvdb…

团队管理新思考_需要一个新的空间来思考讨论和行动

团队管理新思考andrew wong安德鲁黄 Follow跟随 Sep 4 九月4 There is a need for a new space to think, discuss, and act. This need are being felt by the majority of AI / ML / Data Product Managers out there. They are exhausted by the ever increasing data volum…

Uva201

原题地址&#xff1a;https://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid9 题意&#xff1a; 就是要你输入一系列横边的起始点&#xff0c;和竖边的起始点&#xff0c;然后你去找出这些边里面构成的所有正方形。 心得体会 一道难度适中的模拟题&#xf…

2075. 解码斜向换位密码

2075. 解码斜向换位密码 字符串 originalText 使用 斜向换位密码 &#xff0c;经由 行数固定 为 rows 的矩阵辅助&#xff0c;加密得到一个字符串 encodedText 。 originalText 先按从左上到右下的方式放置到矩阵中。 先填充蓝色单元格&#xff0c;接着是红色单元格&#xff…

微服务实战(六):落地微服务架构到直销系统(事件存储)

在CQRS架构中&#xff0c;一个比较重要的内容就是当命令处理器从命令队列中接收到相关的命令数据后&#xff0c;通过调用领域对象逻辑&#xff0c;然后将当前事件的对象数据持久化到事件存储中。主要的用途是能够快速持久化对象此次的状态&#xff0c;另外也可以通过未来最终一…

时间序列数据的多元回归_清理和理解多元时间序列数据

时间序列数据的多元回归No matter what kind of data science project one is assigned to, making sense of the dataset and cleaning it always critical for success. The first step is to understand the data using exploratory data analysis (EDA)as it helps us crea…

vue-cli搭建项目的目录结构及说明

vue-cli基于webpack搭建项目的目录结构 build文件夹 ├── build // 项目构建的(webpack)相关代码 │ ├── build.js // 生产环境构建代码&#xff08;在npm run build的时候会用到这个文件夹&#xff09;│ ├── check-versions.js // 检查node&am…

391. 完美矩形

391. 完美矩形 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) &#xff0c;右上顶点是 (ai, bi) 。 如果所有矩形一起精确覆盖了某个矩形区域&#xff0c;则返回 true &#xff1b;否…

bigquery 教程_bigquery挑战实验室教程从数据中获取见解

bigquery 教程This medium article focusses on the detailed walkthrough of the steps I took to solve the challenge lab of the Insights from Data with BigQuery Skill Badge on the Google Cloud Platform (Qwiklabs). I got access to this lab in the Google Cloud R…

学习linux系统到底有没捷径?

2019独角兽企业重金招聘Python工程师标准>>> 说起linux操作系&#xff0c;可能对于很多不了解的人来说&#xff0c;第一个想到的就是类似于黑客帝国中的黑框框以及一串串不知所云的代码&#xff0c;总之这些感觉都可以总结成为一个字&#xff0c;那就是——酷&#…

机器学习之路:python k近邻回归 预测波士顿房价

python3 学习机器学习api 使用两种k近邻回归模型 分别是 平均k近邻回归 和 距离加权k近邻回归 进行预测 git: https://github.com/linyi0604/MachineLearning 代码&#xff1a; 1 from sklearn.datasets import load_boston2 from sklearn.cross_validation import train_test_…

大话数据结构 (程杰 著)

1转载于:https://www.cnblogs.com/revoid/p/9605734.html

wxpython实现界面跳转

wxPython实现Frame之间的跳转/更新的一种方法 wxPython是Python中重要的GUI框架&#xff0c;下面通过自己的方法实现模拟类似PC版微信登录&#xff0c;并跳转到主界面&#xff08;朋友圈&#xff09;的流程。 &#xff08;一&#xff09;项目目录 【说明】 icon : 保存项目使用…

java职业技能了解精通_如何通过精通数字分析来提升职业生涯的发展,第8部分...

java职业技能了解精通Continuing from the seventh article in this series, we are going to explore ways to present data. Over the past few years, Marketing and SEO field has become more data-driven than in the past thanks to tools like Google Webmaster Tools …

2028. 找出缺失的观测数据

2028. 找出缺失的观测数据 现有一份 n m 次投掷单个 六面 骰子的观测数据&#xff0c;骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份&#xff0c;你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n m 次投掷数据的 平均值 。 给你一个长度为 m 的整数数组 …

51nod 1250 排列与交换——dp

题目&#xff1a;http://www.51nod.com/onlineJudge/questionCode.html#!problemId1250 仔细思考dp。 第一问&#xff0c;考虑已知 i-1 个数有多少种方案。再放入一个数&#xff0c;它是最大的且在最后面&#xff0c;所以它的位置不同的话&#xff0c;就是不同的方案。它在特定…

BZOJ.1024.[SCOI2009]生日快乐(记忆化搜索)

题目链接 搜索&#xff0c;枚举切的n-1刀。 对于长n宽m要切x刀&#xff0c;可以划分为若干个 长n宽m要切x刀 的子问题&#xff0c;对所有子问题的答案取max 对所有子问题的方案取min 就是当前状态答案。 这显然是会有很多重复状态的&#xff0c;用map记忆化(长宽都是double)。 …