表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照
前几天记录了一下表单生成器(Form Builder)之表单数据存储结构mongodb篇,之后便想着伪造一些数据。为什么要伪造数据呢?说来惭愧,因为拖拉拽设计表单以及表单对应的列表的PC端和移动端该显示哪些字段并且是否支持搜索打印(即表单的列表配置)等一系列配置都还没有做,还有就是前面只说了表单相关的设计,设计完了之后就是要使用(录入数据等)对应的这些也还没有做……总之就是现在只有数据结构,但是又想写一下查询,所以只能伪造一些数据。又想着这些数据尽量真实,所以就想写点代码来伪造数据。在写代码的时候,想随机生成一个车辆牌照,所以就有了这篇笔记。
我去,说的太多了,赶紧进入主题。
其实结合上篇笔记:获取一个随机数,之后生成一个车辆牌照还是挺简单的:首先随机获取一个省份,然后在数字和字母中随机获取6个字符,这样就拿到了一个车牌照。但是后来想了一下,既然是随机生成的,就会出现重复的,还有就是新生成的车牌照应该排除目前已经存在车牌照。下面看一下第一版,直接上一下代码:
var getRangeRandomNumber = function(num1,num2){
num1 = Number.isInteger(num1) ? num1: 0;
num2 = Number.isInteger(num2) ? num2: 0;
var minNum=Math.min(num1,num2),maxNum=Math.max(num1,num2);
return Math.round(Math.random() * (maxNum - minNum)) + minNum;
};
var getRandomLicensePlate1=function(){
var strProvinceShorter="京";
var strNumberLetter="12345";
var tempRetLicensePlate=strProvinceShorter[getRangeRandomNumber(strProvinceShorter.length-1)];
for(var i=0;i<5;i++){
tempRetLicensePlate+=strNumberLetter[getRangeRandomNumber(strNumberLetter.length-1)];
}
return tempRetLicensePlate;
};
var tempLicensePlateObj={},licensePlateCounter=Math.pow(5,5);
for(var i=1;i<=licensePlateCounter;i++){
var temp = getRandomLicensePlate1();
if(tempLicensePlateObj[temp]){
tempLicensePlateObj[temp]++;
}
else{
tempLicensePlateObj[temp]=1;
}
}
console.log("想要获取"+licensePlateCounter+"个不同的车牌照");
console.log("结果生成了"+Object.getOwnPropertyNames(tempLicensePlateObj).length+"个不同的车牌照");
console.log("*******************************下面是生成的车牌照详细*******************************");
console.log(JSON.stringify(tempLicensePlateObj));
console.log("*******************************同一个车牌照出现多次的详细:开始*******************************");
for (var key in tempLicensePlateObj) {
if (tempLicensePlateObj.hasOwnProperty(key)) {
if(tempLicensePlateObj[key]>1){
console.log("车牌号:【"+key+"】生成了"+tempLicensePlateObj[key]+"次");
}
}
}
console.log("*******************************同一个车牌照出现多次的详细:结束*******************************");
为了生成重复车牌照的概率大,第一次测试这里缩小了取值范围:


看一下测试结果,重复率还是很高的,那么怎么生成一个不重复的车牌照呢?我想了一个笨方法:就是将已经存在车辆牌照作为参数传递给获取车辆牌照的方法,返回之前做一下判断,如果数组中包含了就递归获取,直到获取到一个不重复的,下面看一下测试二的代码:
var getRangeRandomNumber = function(num1,num2){
num1 = Number.isInteger(num1) ? num1: 0;
num2 = Number.isInteger(num2) ? num2: 0;
var minNum=Math.min(num1,num2),maxNum=Math.max(num1,num2);
return Math.round(Math.random() * (maxNum - minNum)) + minNum;
};
// 获取随机车牌
var getRandomLicensePlate2=(function f(excludeArr){
if(!Array.isArray(excludeArr))excludeArr=[];
//获取车牌照的逻辑
var strProvinceShorter="京";
var strNumberLetter="12345";
var tempRetLicensePlate=strProvinceShorter[getRangeRandomNumber(strProvinceShorter.length-1)];
for(var i=0;i<5;i++){
tempRetLicensePlate+=strNumberLetter[getRangeRandomNumber(strNumberLetter.length-1)];
}
if(excludeArr.indexOf(tempRetLicensePlate)>=0){
tempRetLicensePlate = f(excludeArr);
} else {
excludeArr.push(tempRetLicensePlate);
}
return tempRetLicensePlate;
});
var tempLicensePlateObj={},licensePlateCounter=Math.pow(5,5),tempAllLicensePlates=[];
for(var i=1;i<=licensePlateCounter;i++){
var temp = getRandomLicensePlate2(tempAllLicensePlates);
if(tempLicensePlateObj[temp]){
tempLicensePlateObj[temp]++;
}
else{
tempLicensePlateObj[temp]=1;
}
}
console.log("想要获取"+licensePlateCounter+"个不同的车牌照");
console.log("结果生成了"+Object.getOwnPropertyNames(tempLicensePlateObj).length+"个不同的车牌照");
console.log("*******************************下面是生成的车牌照详细*******************************");
console.log(JSON.stringify(tempLicensePlateObj));
console.log("*******************************同一个车牌照出现多次的详细:开始*******************************");
for (var key in tempLicensePlateObj) {
if (tempLicensePlateObj.hasOwnProperty(key)) {
if(tempLicensePlateObj[key]>1){
console.log("车牌号:【"+key+"】生成了"+tempLicensePlateObj[key]+"次");
}
}
}
console.log("*******************************同一个车牌照出现多次的详细:结束*******************************");

结果想到啊,栈溢出了……我都怀疑我的递归有问题,再看下一个测试结果

这次获取数量(最大值减5)比栈溢出的那次少了5次,就不报错了,接下来我又缩小取值范围,改成了四位数,看一下结果

这次测试也没有问题,最后两次没有问题是不是说明我写的递归没有问题……是不是真的因为内存装不下了???有哪位大神知道这是为什么或者有更好的获取车辆牌照的方法,还请指点一下,谢谢
下面粘一下最终的代码:
var getRangeRandomNumber = function(num1,num2){
num1 = Number.isInteger(num1) ? num1: 0;
num2 = Number.isInteger(num2) ? num2: 0;
var minNum=Math.min(num1,num2),maxNum=Math.max(num1,num2);
return Math.round(Math.random() * (maxNum - minNum)) + minNum;
};
var getRandomLicensePlate=(function f(excludeArr){
if(!Array.isArray(excludeArr))excludeArr=[];
// 生成一个随机车联牌照
var strProvinceShorter="京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川黔滇藏陕甘青宁新港澳台";
var strNumberLetter="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var tempRetLicensePlate=strProvinceShorter[getRangeRandomNumber(strProvinceShorter.length-1)];
for(var i=0;i<6;i++){
tempRetLicensePlate+=strNumberLetter[getRangeRandomNumber(strNumberLetter.length-1)];
}
// 判断这个车联牌照是否存在
if(excludeArr.indexOf(tempRetLicensePlate)>=0){
tempRetLicensePlate = f(excludeArr);
} else {
excludeArr.push(tempRetLicensePlate);
}
return tempRetLicensePlate;
});
最后又用这个测试了一下,生成100000个没问题:
var tempLicensePlateObj={},licensePlateCounter=100000,tempAllLicensePlates=[];
for(var i=1;i<=licensePlateCounter;i++){
var temp = getRandomLicensePlate(tempAllLicensePlates);
if(tempLicensePlateObj[temp]){
tempLicensePlateObj[temp]++;
}
else{
tempLicensePlateObj[temp]=1;
}
}
console.log(tempAllLicensePlates.length);
console.log("想要获取"+licensePlateCounter+"个不同的车牌照");
console.log("结果生成了"+Object.getOwnPropertyNames(tempLicensePlateObj).length+"个不同的车牌照");
console.log("*******************************下面是生成的车牌照详细*******************************");
console.log(JSON.stringify(tempLicensePlateObj));
console.log("*******************************同一个车牌照出现多次的详细:开始*******************************");
for (var key in tempLicensePlateObj) {
if (tempLicensePlateObj.hasOwnProperty(key)) {
if(tempLicensePlateObj[key]>1){
console.log("车牌号:【"+key+"】生成了"+tempLicensePlateObj[key]+"次");
}
}
}
console.log("*******************************同一个车牌照出现多次的详细:结束*******************************");


又测了一下,生成1000000个,直接直接卡死了……算了,就到这里吧!
表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照的更多相关文章
- 表单生成器(Form Builder)之伪造表单数据mongodb篇
这篇文章终于回到了正轨:为mongodb伪造数据.之前的随机数.随机车牌照.随机时间还有这篇笔记中的获取指定长度的中文字符串,都是为这篇笔记做准备.看一下我们的准备(基础代码) // 1.获取指定范围 ...
- 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间
为了伪造一些尽量真实的假数据,也真是够费劲的.上一篇笔记记录了一下获取一个随机车辆牌照,这篇笔记记录一下怎么获取一个随机时间.这篇就不说那么多废话了,直接上代码 // 获取指定范围的随机数 var g ...
- 表单生成器(Form Builder)之mongodb表单数据查询——统计查询求和
上一篇笔记仅是记录了一下简单的关联查询,根据笔记中的场景:将某一车辆关联的耗损记录全部放在了一个字段当中.不知道现在中有没有这种场景,我们的应用中没有类似的场景,可能我们更关注的是某车辆的总耗损金额和 ...
- 表单生成器(Form Builder)之mongodb表单数据查询——关联查询
这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...
- 表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数
上一篇笔记将开始定义的存储结构处理了一下,将FormItems数组中的表单项都拿到mongodb document的最外层,和以前的关系型数据类似,之不过好多列都是动态的,不固定,不过这并没有什么影响 ...
- 表单生成器(Form Builder)之mongodb表单数据——整理数据
在上篇笔记中,为车辆信息表.车辆耗损表以及车辆营收表插入了一些数据.之后便是查询了,重点也在查询……按照之前定好的数据结构,如果查询mongodb document的最外层比较简单,但是我们的重点应该 ...
- 表单生成器(Form Builder)之表单数据存储结构mongodb篇
从这篇笔记开始,记录一下表单生成器(Form Builder)相关的一些东西,网上关于他的介绍有很多,这里就不解释了. 开篇说一下如何存储Form Builder生成的数据.
- Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法
Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...
- 表单组件 form fastadmin(生成表单元素)
Form组件 定义文件位置: /extend/fast/Formphp 通用参数 $name 通常为我们组件的名称(name属性值),我们在后台接收时可以通过这个名称来获取到它所对应的值 $value ...
随机推荐
- CodeForces-617E XOR And Favorite Numbers(莫队)
Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is g ...
- bash单引号嵌套
转自:https://blog.jysoftware.com/2015/12/bash-%E6%80%8E%E4%B9%88%E5%81%9A%E5%8D%95%E5%BC%95%E5%8F%B7%E ...
- 【Web技术】399- 浅谈前端代码加密
作者简介:于航,PayPal Senior Software Engineer,在 PayPal 上海负责 Global GRT 平台相关的技术研发工作.曾任职于阿里巴巴.Tapatalk 等企业.f ...
- 日地拉格朗日L2点轨道的卫星运行
看了嫦娥四号通信的中继卫星,不明白是怎么运行的,下面的演示解除了我的疑问. https://lt.cjdby.net/thread-2479933-1-2.html
- java8新特性 - 什么是函数式接口 @FunctionalInterface?
什么是函数式接口 @FunctionalInterface 源码定义 /** * An informative annotation type used to indicate that an int ...
- PHP函数CURL分别以GET、POST方式请求HTTPS协议接口api
1.curl以GET方式请求https协议接口 function curl_get_https($url){ $curl = curl_init(); // 启动一个CURL会话 curl_setop ...
- vue+element 中 el-input框 限制只能输入数字及一位小数
仅个人经验,希望能帮到有需要的人. 第一次写 就话不多说了直接上代码. <el-input @keyup.native="proving(index)" v-model=&q ...
- java程序员面试经历(不忘初心,永不放弃,方得始终)。
其实一直想静下心好好写一点博客,记录下青春,但一直忙于学习,写bug.....转眼间2017只剩下最后几天,岁月无情划过,不留痕迹,唯有稀疏地中海.哈哈,本篇文章主要是想分享下刚毕业入门找工作的一点小 ...
- Android框架式编程之架构方案
目前移动端应用市场已经是百花齐放,很多独角兽公司都是通过App创业发展起来的,现在App类型更加丰富,功能越来越完善,基本上涵盖了各个行业的每个角落.为了开发出更加有竞争力的App,不仅需要功能上有创 ...
- Kotlin 编程语言成为其 Android 应用程序开发人员的首选语言
今年 5 月,谷歌在 I/O 大会上宣布,Kotlin 编程语言成为其 Android 应用程序开发人员的首选语言. Kotlin 是一种面向现代多平台应用程序的编程语言,成为谷歌开发 Android ...