表单生成器(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个没问题:

  又测了一下,生成1000000个,直接直接卡死了……算了,就到这里吧!

原文地址:https://www.cnblogs.com/du-blog/p/11811328.html

时间: 2024-10-15 05:39:59

表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照的相关文章

Flask入门 表单Flask-wtf form原生 Bootstrap渲染(七)

(1) 原生的表单 模板页面,form表单form.html <form action="{{ url_for('/check/') }}" method='post'> <p>用户名: <input type='text' name='username'></p> <p>密码: <input type='password' name='userpass'></p> <p><input

【jQuery基础学习】07 jQuery表单插件-Form

作用:jQuery Form插件的作用是为了让我们可以很方便地用ajax的方式提交表单,从而使我们提交表单的时候页面不用进行刷新. 它的核心方法是ajaxForm()和ajaxSubmit() 升级表单提交方式的时候很简单,不用去改变HTML结构,如下即可: //就是下面这么简单 $("#myForm").ajaxForm(function(){ //提交成功后的操作 }); //你也可以这样 $("#myform").submit(function(){ $(th

[转载]WebBrowser控件表单(form)的自动填写和提交

话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了.这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢).那么,无论我们是想做一个"定制版IE",还是希望利用HTML来做用户界面(指WinApp而非WebApp.许多单机软件,包括Windows的帮助支持中心,都是HTML做的),都少不了Windows Form和包含在WebBrowser中的Web页面的交互.本文将通过几个实际的例子,初步介绍

Ext JS表单Ext.form.FormPanel

1.表单 对于传统的b/s应用来说,数据录入元素是放在表单<form>标签里面的.而对于ExtJS应用来说,则可以直接使用FormPanel控件来存放表单中的元素.FormPanel继承自Panel,在Panel的基础上提供与表单相关的各种特性,比如可以指定表单提交的url.指定表单提交方式.是否是二进制提交等:另外FormPanel固定使用form布局,前面关于布局一节中的内容我们说过,form布局也就是专门用于组织包含输入元素的布局. 看下面的代码: 1 Ext.onReady(funct

表单插件——form

表单插件——form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的options对象获取服务器返回数据,调用格式如下: $(form). ajaxForm ({options}) 其中form参数表示表单元素名称:options是一个配置对象,用于在发送ajax请求过程,设置发送时的数据和参数. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

第七章(插件的使用和写法)(7.2 jQuery 表单插件 ----- Form)

7.2 jQuery 表单插件 ----- Form 7.2.1 Form 插件简介 jQuery Form 插件是一个优秀的 Ajax 表单插件,可以非常容易地.无侵入地升级 HTML 表单以支持 Ajax.jQuery Form 有两个核心方法----- ajaxForm()  和 ajaxSubmit() .它们集合了从控制表单元素到决定如何管理提交进程的功能,另外,插件还包括其他一些方法: formToArray() / formSerialize() / fieldSerialize(

表单标签: &lt;form&gt;

表单标签: <form> 功能:表单用于向服务器传输数据,从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段.复选框.单选框.提交按钮等等. 表单还可以包含textarea.select.fieldset和 label标签. 表单属性 action: 表单提交到哪.一般指向服务器端一个程序,程序接收到表单提交过来的数据(即表单元素值)作相应处理,比如https://www.sogou.com/web method: 表单的提交方式 post/get默认取值就是get

Django使用普通表单、Form、以及modelForm操作数据库方式总结

Django使用普通表单.Form.以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样: 进入填写表单页面: 在表单页面填写信息,并提交: 表单数据验证 验证成功,和数据库进行交互(增删改查): 验证成功,页面提示表单填写失败: 一.Django使用普通表单操作数据库 1.html代码: <form action="/add/" method="post" name="addbook"> {%

表单的属性和方法, 获取表单和表单的元素, 验证表单

表单的属性和方法 一. 表单字段的属性(id/name/value/form),这里用value属性来举例 上面的form属性代表获取表单字段的父级表单对象 1. 属性的获取         console.log(document.myform.username.value); 2. 属性的设置            document.myform.username.value="123"; 3. 获取表单字段的父级表单对象 console.log(document.myform.u