ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11493|回复: 5

[转帖] VBA编程产生不重复随机数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-12-7 13:16 | 显示全部楼层 |阅读模式
本帖最后由 autumnalRain 于 2016-12-7 13:39 编辑


VBA编程实现不重复随机数输出。VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了。RND取值范围是[0,1),意思是01之间的一个随机数,包含0,但不包含1

1、用法

语法:Rnd[(number)]
  如果 number 的值是 Randomize 生成
  小于 0 ,每次都使用 number 作为随机数种子得到的相同结果。
  大于 0 ,以上一个随机数为种子产生下一个随机数。
  等于 0 ,产生与最近生成的随机数相同的随机数。
  省略,以上一个随机数为种子产生下一个随机数。

说明:
  Rnd 函数返回小于 1 但大于或等于 0 的值。
  number 的值决定了 Rnd 生成随机数的方式。
  对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。
  在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器(若带参数,则产生由参数对应的一个特定序列的随机数),该生成器具有根据系统计时器得到的种子。
  为了生成某个范围内的随机整数,可使用以下公式:
  Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
  这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
  注意:若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-12-7 13:33 | 显示全部楼层
本帖最后由 autumnalRain 于 2016-12-7 13:44 编辑

1、无重复随机数算法一
这是最简单的算法,每产生一个随机数,就和已有的比较,如果已经存在,则重新产生。比较适合从一个大范围里面抽出一小部分数据,比如,从题库中抽取试题。
Public SubRndNumberNoRepeat1()
    Dim RndNumber, temp(20), i, k, Maxrec AsInteger
    Randomize (Timer)           '初始化随机数生成器
    Maxrec = 100      ' 从A21开始输出随机数
    k = 0
     Do While k < 20
        RndNumber = Int(Maxrec * Rnd) + 1
        temp(k) = RndNumber
        Cells(k + 21, 1) = RndNumber
        For i = 0 To k - 1
            If temp(i) = RndNumber Then ExitFor
        Next i
            If i = k Then k = i + 1 'MsgBox"随机数:" & RndNumber
    Loop
End Sub
2、无重复随机数算法二
这个算法比较巧妙,需要细细体会,才能知道真谛。这个算法不会重复产生随机数,但需要一个占位数组。比较适合输出范围之内所有数值的场合,比如,随机发牌。
SubRndNumberNoRepeat2()
    Dim RndNumber, TempArray(99), i As Integer
    Randomize (Timer)           '初始化随机数生成器
    For i = 0 To 99            '产生包含1-100的不重复的随机数列
        TempArray(i) = i
    Next i
    For i = 99 To 80 Step -1
        RndNumber = Int(i * Rnd)
       Cells(120 - i, 1) = TempArray(RndNumber) + 1 '从A21开始输出这些数字
        TempArray(RndNumber) = TempArray(i)
    Next i
End Sub
3、无重复随机数算法三
这个算法使用字典对象完成去重复,和第一个算法差不多,但程序看上去简洁一点,嗯,起码新颖一点。
SubRndNumberNoRepeat3()
    Dim d As Object   'New Dictionary
    Dim s As Integer
    Randomize (Timer)           '初始化随机数生成器
    Set d= CreateObject("Scripting.Dictionary")
    Do Until d.Count = 20
        s = Int(Rnd * 100 + 1)
        d(s) = ""
    Loop
    [a21].Resize(d.Count, 1) =Application.Transpose(d.Keys)
End Sub

TA的精华主题

TA的得分主题

发表于 2017-10-26 23:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-1-2 10:40 | 显示全部楼层
leasunpop 发表于 2017-10-26 23:56
谢谢分享!!!!!!!!!!!!

只生成单数、或双数随机数,应该怎样修改程序?

TA的精华主题

TA的得分主题

发表于 2019-1-6 13:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-27 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不错,学习了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 05:07 , Processed in 0.032209 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表