Excel随机生成数据2
200万耗时大约 10秒以内,输出结果到txt文件。
- Sub GetPassword() 'by kagawa
- Dim i&, j&, k&, l&, m&, n&, r&, s$, s1$, s2$, t$, c1&, c2&, cnt&, tms#
- tms = Timer
- m = ActiveCell
- If m = 0 Then m = 2 * 10 ^ 6
- n = 6
- s = "ABC2DEF3HJK4LM5NPQ7RST8UVW9XYZ" '原始字符 特意把数字打散均匀插入字母中
- s1 = "2345789" '仅数字
- s2 = "ABCDEFHJKLMNPQRSTUVWXYZ" '仅字母
- l = Len(s)
- l1 = Len(s1)
- l2 = Len(s2)
- ReDim arr(1 To l) As Boolean '记录数值位置的数组 以便后面检查是否含有数字
- For i = 1 To l
- If IsNumeric(Mid(s, i, 1)) Then arr(i) = True
- Next
- ReDim brr&(1 To n - 1) '密码前5位的对应序号基值 方便今后调用 节省计算时间
- For i = 1 To n - 1
- k = k + l ^ (i - 1)
- brr(i) = l ^ (i - 1)
- Next
- ReDim crr$(1 To k * l) '定义记录前5位字符的相应序号的数组 便于排除重复
- t = "VN" & String(n, " ") '生成需要长度的空白字符
- Open ActiveWorkbook.Path & "\Password.txt" For Output As #1 '打开Txt记录文件
- Randomize '随机种子初始化 以便每次宏运行时得到不同的随机序列
- For i = 1 To m '生成指定个数=m的密码
- Do
- c1 = 0: c2 = 0: k = 0 '记录初始化 c1=含数字 c2=含字母 k=前5位序号
- For j = 1 To n - 1
- r = Int(Rnd * l) + 1 '取得随机字符
- k = k + r * brr(j) '计算累计序号
- If arr(r) Then c1 = 1 Else c2 = 1 '检查记录是否含数字或字母
- Mid(t, j + 2, 1) = Mid(s, r, 1) '指定位置替换成该随机字符
- Next
- If c1 + c2 = 2 Then '如果数值和字符都含有了
- r = Int(Rnd * l) + 1 '那就可以任意取值
- Mid(t, j + 2, 1) = Mid(s, r, 1)
- Else
- If c1 = 0 Then '如果不含数字
- r = Int(Rnd * l1) + 1 '那最后一个加入数字
- Mid(t, j + 2, 1) = Mid(s1, r, 1)
- Else '如果不含字母
- r = Int(Rnd * l2) + 1 '最后一个加入字母
- Mid(t, j + 2, 1) = Mid(s2, r, 1)
- End If
- End If
- If crr(k) = "" Then '如果前5位序号不重复记录为空
- crr(k) = t '记录本次有效结果 以便今后检查重复
- Print #1, t '记录到txt文件
- Exit Do '退出本次计算
- Else '如果该序号已有记录
- If InStr(crr(k), t) = 0 Then 则进一步检查是否相同 如果不同则有效
- crr(k) = crr(k) & "," & t '记录中加入新的结果以便今后检查重复
- Print #1, t '记录到txt文件
- Exit Do '退出本次计算
- Else
- cnt = cnt + 1 '统计重复次数
- End If
- End If
- Loop
- Next
- Close #1 '关闭txt文件
- ActiveCell.Offset(, 1) = Format(Timer - tms, "0.000")
- ActiveCell.Offset(, 2) = cnt
- ActiveCell.Offset(1).Activate
- MsgBox Format(Timer - tms, "0.000s ") & cnt & " / " & m
- End Sub
生成200万不重复密码的【字典嵌套算法】,突破了字典方法在数量巨大是必然死机的障碍。
但实际速度仍然比较慢,比我的数组防止重复法要慢3-5倍。
- Sub test5()
- Dim d, i&, m&, s, t$, t1$, t2$, cnt&, tms#
- tms = Timer
- m = ActiveCell: If m = 0 Then m = 2 * 10 ^ 6
- ' s = Split("2 3 4 5 7 8 9 A B C D E F H J K L M N P Q R S T U V W X Y Z")
- s = Split("A B C 2 D E F 3 H J K 4 L M 5 N P Q 7 R S T 8 U V W 9 X Y Z")
- Open ActiveWorkbook.Path & "\Password.txt" For Output As #1
- Set d = CreateObject("Scripting.Dictionary")
- Randomize
- Do
- t1 = ""
- For i = 1 To 2
- t1 = t1 & s(Int(Rnd * 30))
- Next
- If Not d.Exists(t1) Then Set d(t1) = CreateObject("Scripting.Dictionary")
- '仅取前2位字符作为key加入字典、并设置每一个New key作为嵌套的字典。
- Do
- t2 = ""
- For i = 1 To 4
- t2 = t2 & s(Int(Rnd * 30))
- Next
- If Not d(t1).Exists(t2) Then '后四位在字典中比对 如果不重复则
- t = "VN" & t1 & t2 '把密码拼接出来
- If t Like "*[0-9]*" Then '确认含数字
- If t Like "VN*[A-Z]*" Then '确认含字母
- d(t1)(t2) = "" '该密码有效 加入嵌套字典 排除今后重复
- Print #1, t '输出结果到txt文件
- cnt = cnt + 1 '有效统计+1
- Exit Do
- End If
- End If
- End If
- Loop
- Loop Until cnt = m '达到目标数如 200万后退出
- Close #1 '关闭txt文件
- ActiveCell.Offset(, 1) = Format(Timer - tms, "0.000")
- ActiveCell.Offset(1).Activate
- MsgBox Format(Timer - tms, "0.000s ") & m
- '下面是统计各个嵌套字典的关键词数量。
- krr = d.keys
- For i = 0 To d.Count - 1
- Cells(i + 2, 5) = d(krr(i)).Count
- Next
- Set d = Nothing
- End Sub
- Sub test()
- Dim d, i&, m&, s, t$
- Randomize
- m=200000 '建议不超过20万 超过则字典运算速度大幅度降低。
- s = Split("A B C 2 D E F 3 H J K 4 L M 5 N P Q 7 R S T 8 U V W 9 X Y Z") '按我的序列速度较快
- Set d = CreateObject("Scripting.Dictionary")
- t = "VN" & String(6, " ") '生成密码模板
- Do
- For i = 3 To 8
- Mid(t, i, 1) = s(Int(Rnd * 30)) '直接替换速度更快
- Next
- If t Like "*[0-9]*" Then If t Like "VN*[A-Z]*" Then d(t) = "" '检查数字字母都含有时加入字典
- Loop Until d.Count = m '确认字典中不重复项达到m值时退出Do循环
- ' [a1].Resize(m) = Application.Transpose(d.keys) '输出结果 注意仅65536以下可以用Transpose
- Set d = Nothing
- End Sub
Excel随机生成数据2的更多相关文章
- Excel随机生成数据
CONCATENATE函数是一个文本连接函数,非常简单,和&的效果一样. CONCATENATE是一个文本连接函数 语法:CONCATENATE(text1,text2,text3...... ...
- 用python随机生成数据,再插入到postgresql中
用python随机生成学生姓名,三科成绩和班级数据,再插入到postgresql中. 模块用psycopg2 random import random import psycopg2 fname=[' ...
- Excel随机生成批量日期,以及注意事项
这个是WPS里写的一个函数,用来随机生成日期.首先E1和E2是两个日期端点,右键把单元格格式先设置成“日期”中的“xxxx年xx月xx日 xx:xx”,然后E3=E1-E2算出它们的距离. 在E4里面 ...
- sql随机插入数据--记录
sql面试题中经常出现一张学生表,表字段有学生ID,学生课程,学生成绩 今天要实测,so,需要有数据,now,随机生成数据,,, create table student ( id ), --编号 c ...
- Web 开发人员必备的随机 JSON 数据生成工具
在 Web 开发中,经常会需要一些测试数据来测试接口或者功能时候正确.JSON Generator 就是这样一款生成随机 JSON 数据的在线工具,Web 开发人员必备,记得收藏和分享啊. 您可能感兴 ...
- 【转】Visual Studio 2010在数据库生成随机测数据
测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...
- 利用Java随机,生成随机学生数据
为模拟向数据库中大量插入学生数据(注:此处应该用PreparedStatement.batchUpdate等批处理提高效率)的情形,通过Java随机来生成学生数据. 一.要生成的学生数据 studen ...
- Python 项目实践二(生成数据)第二篇之随机漫步
接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...
- excel生成数据地图
在数据分析过程中,图表是一个十分重要的部分,通过图表可以清晰明了的说明一些数字特征.在众多数据分析图表中,数据地图是常用的一中分析图.在一般的数据分析中,excel已经可以满足绝大部分功能.在本文中, ...
随机推荐
- 【Linux】head命令
用途 它是用来显示开头或结尾某个数量的文字区块 全称 head的全称即为head 参数 -q :隐藏文件名 -v :显示文件名 -c :<字节>显示字节数 -n :<行数>显示 ...
- docker sshd image problem, session required pam_loginuid.so, cann't login
在使用sshd docker 镜像时, 发现一个比较诡异的问题, 有些启动的容器可以连接, 有些不能. 例如 : 启动2个容器(这两个容器都有问题) : [root@localhost ~]# d ...
- Node.js 使用JWT进行用户认证
代码地址如下:http://www.demodashi.com/demo/13847.html 运行环境 该项目基于 node(v7.8.0版本以上) 和 mongodb 数据库,因此电脑上需要安装这 ...
- 使用CXF实现基于Rest方式的WebService
本文介绍使用CXF实现基于Rest方式的WebService(CXF的版本是3.0.0) 一. 前言 Java有三种WebService规范:Jax-WS,Jax-RS,Jaxm 1. Jax-WS( ...
- C#指南,重温基础,展望远方!(13)C#泛型
一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能 ...
- psr-0和psr-4命名规范(未完)
这些命名规范都是为为自动加载服务(避免项目中有很多的include和require) psr-0: 1.命名空间必须与绝对路径一致 2.类名首字母必须大写 3.除入口文件外,其他“.php”必须只有一 ...
- [Jobdu] 题目1377:缓变序列
题目描述: 陈博在写论文时碰到一个难题:如何将给定的整数序列变换成缓变序列:即任意两个相邻的元素相差均为1,第1个元素和最后一个元素相差也为1. 变换是指改变原整数序列中各元素的顺序.例如整数序列1, ...
- URL与URI
1.URI是统一资源标识符,是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作.URI由包括确定语法和相关协议的方案所定义.由是三个 ...
- 商派onex本地部署无法进入的问题
商派最新版的ONex本地虚拟机部署项目无法进入注册的问题解决 进入项目的database.php文件,复制host的值 vim /etc/hosts,将hosts内容添加到/etc/hosts里面去就 ...
- 一款纯css3实现的超炫3D表单
今天要给大家分享一款纯css3实现的超炫3D表单.该特效页面的加载的时候3d四十五度倾斜,当鼠标经过的时候表单动画回正.效果非常炫,一起看下效果图: 在线预览 源码下载 实现的代码. html代码 ...