200万耗时大约 10秒以内,输出结果到txt文件。

  1. Sub GetPassword() 'by kagawa
  2. Dim i&, j&, k&, l&, m&, n&, r&, s$, s1$, s2$, t$, c1&, c2&, cnt&, tms#
  3. tms = Timer
  4. m = ActiveCell
  5. If m = 0 Then m = 2 * 10 ^ 6
  6. n = 6
  7. s = "ABC2DEF3HJK4LM5NPQ7RST8UVW9XYZ" '原始字符 特意把数字打散均匀插入字母中
  8. s1 = "2345789" '仅数字
  9. s2 = "ABCDEFHJKLMNPQRSTUVWXYZ" '仅字母
  10. l = Len(s)
  11. l1 = Len(s1)
  12. l2 = Len(s2)
  13. ReDim arr(1 To l) As Boolean '记录数值位置的数组 以便后面检查是否含有数字
  14. For i = 1 To l
  15. If IsNumeric(Mid(s, i, 1)) Then arr(i) = True
  16. Next
  17. ReDim brr&(1 To n - 1) '密码前5位的对应序号基值 方便今后调用 节省计算时间
  18. For i = 1 To n - 1
  19. k = k + l ^ (i - 1)
  20. brr(i) = l ^ (i - 1)
  21. Next
  22. ReDim crr$(1 To k * l) '定义记录前5位字符的相应序号的数组 便于排除重复
  23. t = "VN" & String(n, " ") '生成需要长度的空白字符
  24. Open ActiveWorkbook.Path & "\Password.txt" For Output As #1 '打开Txt记录文件
  25. Randomize '随机种子初始化 以便每次宏运行时得到不同的随机序列
  26. For i = 1 To m '生成指定个数=m的密码
  27. Do
  28. c1 = 0: c2 = 0: k = 0 '记录初始化 c1=含数字 c2=含字母 k=前5位序号
  29. For j = 1 To n - 1
  30. r = Int(Rnd * l) + 1 '取得随机字符
  31. k = k + r * brr(j)     '计算累计序号
  32. If arr(r) Then c1 = 1 Else c2 = 1 '检查记录是否含数字或字母
  33. Mid(t, j + 2, 1) = Mid(s, r, 1) '指定位置替换成该随机字符
  34. Next
  35. If c1 + c2 = 2 Then '如果数值和字符都含有了
  36. r = Int(Rnd * l) + 1 '那就可以任意取值
  37. Mid(t, j + 2, 1) = Mid(s, r, 1)
  38. Else
  39. If c1 = 0 Then '如果不含数字
  40. r = Int(Rnd * l1) + 1 '那最后一个加入数字
  41. Mid(t, j + 2, 1) = Mid(s1, r, 1)
  42. Else '如果不含字母
  43. r = Int(Rnd * l2) + 1 '最后一个加入字母
  44. Mid(t, j + 2, 1) = Mid(s2, r, 1)
  45. End If
  46. End If
  47. If crr(k) = "" Then '如果前5位序号不重复记录为空
  48. crr(k) = t '记录本次有效结果 以便今后检查重复
  49. Print #1, t '记录到txt文件
  50. Exit Do '退出本次计算
  51. Else '如果该序号已有记录
  52. If InStr(crr(k), t) = 0 Then 则进一步检查是否相同 如果不同则有效
  53. crr(k) = crr(k) & "," & t '记录中加入新的结果以便今后检查重复
  54. Print #1, t '记录到txt文件
  55. Exit Do '退出本次计算
  56. Else
  57. cnt = cnt + 1 '统计重复次数
  58. End If
  59. End If
  60. Loop
  61. Next
  62. Close #1 '关闭txt文件
  63. ActiveCell.Offset(, 1) = Format(Timer - tms, "0.000")
  64. ActiveCell.Offset(, 2) = cnt
  65. ActiveCell.Offset(1).Activate
  66. MsgBox Format(Timer - tms, "0.000s ") & cnt & " / " & m
  67. End Sub

生成200万不重复密码的【字典嵌套算法】,突破了字典方法在数量巨大是必然死机的障碍。
但实际速度仍然比较慢,比我的数组防止重复法要慢3-5倍。

  1. Sub test5()
  2. Dim d, i&, m&, s, t$, t1$, t2$, cnt&, tms#
  3. tms = Timer
  4. m = ActiveCell: If m = 0 Then m = 2 * 10 ^ 6
  5. '    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")
  6. 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")
  7. Open ActiveWorkbook.Path & "\Password.txt" For Output As #1
  8. Set d = CreateObject("Scripting.Dictionary")
  9. Randomize
  10. Do
  11. t1 = ""
  12. For i = 1 To 2
  13. t1 = t1 & s(Int(Rnd * 30))
  14. Next
  15. If Not d.Exists(t1) Then Set d(t1) = CreateObject("Scripting.Dictionary")
  16. '仅取前2位字符作为key加入字典、并设置每一个New key作为嵌套的字典。
  17. Do
  18. t2 = ""
  19. For i = 1 To 4
  20. t2 = t2 & s(Int(Rnd * 30))
  21. Next
  22. If Not d(t1).Exists(t2) Then '后四位在字典中比对 如果不重复则
  23. t = "VN" & t1 & t2 '把密码拼接出来
  24. If t Like "*[0-9]*" Then '确认含数字
  25. If t Like "VN*[A-Z]*" Then '确认含字母
  26. d(t1)(t2) = "" '该密码有效 加入嵌套字典 排除今后重复
  27. Print #1, t '输出结果到txt文件
  28. cnt = cnt + 1 '有效统计+1
  29. Exit Do
  30. End If
  31. End If
  32. End If
  33. Loop
  34. Loop Until cnt = m '达到目标数如 200万后退出
  35. Close #1 '关闭txt文件
  36. ActiveCell.Offset(, 1) = Format(Timer - tms, "0.000")
  37. ActiveCell.Offset(1).Activate
  38. MsgBox Format(Timer - tms, "0.000s ") & m
  39. '下面是统计各个嵌套字典的关键词数量。
  40. krr = d.keys
  41. For i = 0 To d.Count - 1
  42. Cells(i + 2, 5) = d(krr(i)).Count
  43. Next
  44. Set d = Nothing
  45. End Sub
  1. Sub test()
  2. Dim d, i&, m&, s, t$
  3. Randomize
  4. m=200000 '建议不超过20万 超过则字典运算速度大幅度降低。
  5. 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") '按我的序列速度较快
  6. Set d = CreateObject("Scripting.Dictionary")
  7. t = "VN" & String(6, " ") '生成密码模板
  8. Do
  9. For i = 3 To 8
  10. Mid(t, i, 1) = s(Int(Rnd * 30)) '直接替换速度更快
  11. Next
  12. If t Like "*[0-9]*" Then If t Like "VN*[A-Z]*" Then d(t) = "" '检查数字字母都含有时加入字典
  13. Loop Until d.Count = m '确认字典中不重复项达到m值时退出Do循环
  14. '    [a1].Resize(m) = Application.Transpose(d.keys) '输出结果 注意仅65536以下可以用Transpose
  15. Set d = Nothing
  16. End Sub

Excel随机生成数据2的更多相关文章

  1. Excel随机生成数据

    CONCATENATE函数是一个文本连接函数,非常简单,和&的效果一样. CONCATENATE是一个文本连接函数 语法:CONCATENATE(text1,text2,text3...... ...

  2. 用python随机生成数据,再插入到postgresql中

    用python随机生成学生姓名,三科成绩和班级数据,再插入到postgresql中. 模块用psycopg2 random import random import psycopg2 fname=[' ...

  3. Excel随机生成批量日期,以及注意事项

    这个是WPS里写的一个函数,用来随机生成日期.首先E1和E2是两个日期端点,右键把单元格格式先设置成“日期”中的“xxxx年xx月xx日 xx:xx”,然后E3=E1-E2算出它们的距离. 在E4里面 ...

  4. sql随机插入数据--记录

    sql面试题中经常出现一张学生表,表字段有学生ID,学生课程,学生成绩 今天要实测,so,需要有数据,now,随机生成数据,,, create table student ( id ), --编号 c ...

  5. Web 开发人员必备的随机 JSON 数据生成工具

    在 Web 开发中,经常会需要一些测试数据来测试接口或者功能时候正确.JSON Generator 就是这样一款生成随机 JSON 数据的在线工具,Web 开发人员必备,记得收藏和分享啊. 您可能感兴 ...

  6. 【转】Visual Studio 2010在数据库生成随机测数据

    测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...

  7. 利用Java随机,生成随机学生数据

    为模拟向数据库中大量插入学生数据(注:此处应该用PreparedStatement.batchUpdate等批处理提高效率)的情形,通过Java随机来生成学生数据. 一.要生成的学生数据 studen ...

  8. Python 项目实践二(生成数据)第二篇之随机漫步

    接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...

  9. excel生成数据地图

    在数据分析过程中,图表是一个十分重要的部分,通过图表可以清晰明了的说明一些数字特征.在众多数据分析图表中,数据地图是常用的一中分析图.在一般的数据分析中,excel已经可以满足绝大部分功能.在本文中, ...

随机推荐

  1. SQLSERVER中的 CEILING函数和 FLOOR函数

    SQLSERVER中的 CEILING函数和 FLOOR函数 --SQLSERVER中的 CEILING函数和 FLOOR函数 --ceiling函数返回大于或等于所给数字表达式的最小整数. --fl ...

  2. 关于Csdn水区被占据一事 (2015-08-01)

    例如以下图所看到的 水区被占据 ,假设发贴机不仅仅在水区发贴.也在其他版块也发贴,将不堪设想啊各位. 如今非常多站点也经历过被 注冊机,发贴机,乱炸,是非常可恨的事.可是您想想.为什么注冊机.发贴机会 ...

  3. 名词解释:alpha版、beta版、rc版的意思(转)

    很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思. alpha版:内部测试版.α是希腊字母 ...

  4. 通用的sql语句

    1.插入: INSERT INTO 表名称 VALUES (值1, 值2,....) 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALU ...

  5. 开发基于CXF的 RESTful WebService web 项目 webservice发布

    配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <se ...

  6. ubuntu下c语言hello world

    1.首先用vi编写一个c语言程序文件,命令行输入:vi helloworld.c,建立一个名叫"helloworld.c"的文件 2.在文件中输入内容 #include <s ...

  7. cat /proc/iomem

    在proc目录下有iomem和ioports文件,其主要描述了系统的io内存和io端口资源分布. 对于外设的访问,最终都是通过读写设备上的寄存器实现的,寄存器不外乎:控制寄存器.状态寄存器和数据寄存器 ...

  8. 摘:常用函数(包括:宽字符函数、普通C函数 )

    只要看见“W”就是宽的意思,左边wchar_t,右边char 字符分类: 宽字符函数            普通C函数            描述 iswalnum()             isa ...

  9. unity, stateMachine, change state name

    如图,假设wingsLayer下有个state,叫“New State“,现在想给它改名,则一定要保证当前wingsLayer为选中状态,然后才能在Inspector中可以为其改名.否则若当前选中的不 ...

  10. unity, 忽略碰撞

    一,layer之间忽略碰撞. Edit->Project Settings->Physics->Layer Collision Matrix 二,collider之间忽略碰撞. vo ...