-
VBA产生随机数的函数
2015-03-23 10:43:04'Dim min As Integer '定义随机数的最小值 'Dim max As Integer '定义随机数的最大值 '限制只产生500个,VBA的速度问题 Public Function CreateRND(ByVal min As Integer, _<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="vb">'Dim min As Integer '定义随机数的最小值 'Dim max As Integer '定义随机数的最大值 '限制只产生500个,VBA的速度问题 Public Function CreateRND(ByVal min As Integer, _ ByVal max As Integer) As Integer() Dim a_size As Integer a_size = max - min If a_size > 500 Or max - min + 1 < a_size Then: Exit Function '限制只产生500个,VBA的速度问题 '如果最大值和最小值的差小于数组大小数值就什么也不做 Dim arr() As Integer '定义数组 ReDim arr(a_size) '更改数组大小 Dim flag As Boolean '定义标志变量,用来判断是否有重复值 Randomize (Now()) '用当前时间生成随机数种子 For i = 0 To a_size '循环生成随机数 Do arr(i) = Rnd() * (max - min) + min '生成随机数 flag = False For j = 0 To (i - 1) '循环判断当前的随机数是否和前面生成的随机数相同,如果相同就重新生成 If (arr(i) = arr(j)) Then flag = True End If Next Loop While flag '循环中不断生成随机数,直到不重复为止 Next CreateRND = arr End Function
调用方法:Dim arr() As Integer arr = CreateRND(10034, 0, 10034)
-
请教用VBA产生随机数的问题!
2006-02-15 13:12:00背景:用PPT做一个选号的界面,按开始便不断地产生随机数(1-24),按停止则显示一个随机数。条件:1、24个数字分为6组第一组:1,2,3,4第二组:5,6,7,8第三组:9,10,11,12第四组:13,14,15,16第五组:17...背景:
用PPT做一个选号的界面,按开始便不断地产生随机数(1-24),按停止则显示一个随机数。
条件:
1、24个数字分为6组
第一组:1,2,3,4
第二组:5,6,7,8
第三组:9,10,11,12
第四组:13,14,15,16
第五组:17,18,19,20
第六组:21,22,23,242、每次产生一个随机数,但要产生多次(最终可产生1-6个随机数)。
3、在每一轮的选号中产生的任意两个随机数不能是同一组的。也就是说产生一个随机数后,下一个随机数不可以在同一组产生。
哪位高手帮帮我!!谢。。。。。。。。。。。。。。。
-
VBA的 随机数 rnd 和 randomize 如何配合使用? 伪随机数带来的问题,根据需要产生不同的随机数!
2021-01-29 17:32:56Rnd函数在产生随机数的时候,并不bai是真正的随机,而是通过一定的公式计算产生的随机,现在我们把那个计算产生随机数的公式叫做f(x),第一个x取值为1 那么便会产生第一个随机数f(1),第2个随机数是在第一个随机数...总结前置
- 如果想永远生成相同的随机数,就用rnd(-1) 但是这么做没意义吧?
- 如果想每次生成的随机数,本次程序运行结束前都一样,下次计算时不一样。就用 randmize 和 rnd(0)
- 如果想永远生成不同的随机数,无论是序列内,还是在不同的环境重新运行都不同,就用 randmize 和 rnd(1) 或 randmize 和 rnd 缺省就可以。
1 VBA中直接使用 rnd,是一个公式计算出来的模拟(伪随机)
- 什么叫伪随机
- 随机数的生成是使用一个写定的公式,来模拟随机的感觉
- 但是这个生成随机数的模拟公式 f(f(f(1))) 受第一个数影响很大,一般称为随机种子
- 如何形象的理解伪随机数
- 你就想象,你的随机函数,每次生成的都是 3.1415926 这个序列,先给你生成3 1 4 1 5 9 2 6.。。。,下次你重新,还是从3 1 4 1 5 9 2 6.。。。 开始
2 伪随机数会带来什么问题:永远是同一组随机数
- 下面是一个对比测试
- 都是同一段代码
- 最左边的是,多次运行代码的结果,看起来每次随机的结果都不同
- 中间的,是每次执行后,都点停止运行,再点开始运行,这样loop循环操作出的结果
- 最右边的,是每次执行后,点3次运行,然后点停止运行,这样loop循环操作出的结果
- 对比后,发现很神奇的结果
- VBA里默认用 rnd 随机,如果一直运行,其实能一直往下随机
- 但是随机出的这一串数其实每次都是固定的从第1个 0.7055475 开始,可以说这1串数是固定的!也就是,每次重新开始,都是这一串相同的数组!
- 也就是相当于,不同的时候,重新开始执行这个 rnd 随机,随机结果永远相同!
- 也就是这段代码,每次在不同的时候重新开始运行,总是生成相同的随机数序列!!!!
Sub t1111() Debug.Print Rnd End Sub
- 参考内容
- Rnd函数在产生随机数的时候,并不是真正的随机,而是通过一定的公式计算产生的随机,现在我们把那个计算产生随机数的公式叫做f(x),第一个x取值为1
- 那么便会产生第一个随机数f(1),第2个随机数是在第一个随机数的基础上产生的即f(f(1)),依次类推,第3个随机数是f(f(f(1)))
- 不难发现,第一个数1,对于产生的一系列随机数是非常重要的,这个1,我们称之为种子数,一个种子数就对应一系列的随机数,如果种子数不发生变化,那么便会生成一系列相同的随机数
- 这段分析来自网上一个大神写的
- https://zhidao.baidu.com/question/1945597673623666508.html
3 关于 rnd 的语法
3.1 基本语法
- excel里用 rand() 和 randbetween()
- VBA里用 rnd
Rnd[(number)]
可选的 number 参数是 Single 或任何有效的数值表达式。
返回值
如果 number 的值是 Rnd 生成
小于 0 每次都使用 number 作为随机数种子得到的相同结果。
大于 0 序列中的下一个随机数。
等于 0 最近生成的数。
省略 序列中的下一个随机数。
说明
Rnd 函数返回小于 1 但大于或等于 0 的值。
number 的值决定了 Rnd 生成随机数的方式。
对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有根据系统计时器得到的种子。
为了生成某个范围内的随机整数,可使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。3.2 基本用法
- 要知道 rnd 是左闭右开区间 [0,1)
- 如果要生成 a~b之间的随机数,一般是 a+ (b-a)*rnd
3.3 rnd 和 rnd(-1) rnd(0) rand(1) 参数负数,零,和正数
- 测试下面3段代码,发现只有 rnd(2 ) 每次随机都变化
Sub TEST1() For i = 1 To 3 Debug.Print Rnd(-1) Next End Sub Sub TEST2() For i = 1 To 3 Debug.Print Rnd(0) Next End Sub Sub TEST3() For i = 1 To 10 Debug.Print Rnd(2) Next End Sub
- 最左边是test1的结果
- 其次是test2的结果
- 第3个是test3 一直点运行的结果
- 第4个是test3 点一次运行,点一次停止后的结果,可见,每次重新开始,每次开始都是那3个
3.4 直接用 rnd 和 rnd(-1) rnd(0) rand(1) 的总结
小于 0 每次都使用 number 作为随机数种子得到的相同结果。
大于 0 序列中的下一个随机数。
等于 0 最近生成的数。
省略 序列中的下一个随机数。- rnd(-1) 永远 生成相同的随机数,无论是继续生成下一个,还是重新开始随机
- rnd(0) 生成最近生成的数。也就是继续生成下一个的时候会是一样的上次的,重新开始也是一样,因为拥有=第1个。
- rnd(1) 生成下一个数,且生成的下一个会不一样。但是,重新开始会依然从相同的第1个开始,也就是序列相同。
- rnd 同正数的
3.5 配合 randomize 直接用 rnd 和 rnd(-1) rnd(0) rand(1) 参数负数,零,和正数
Sub TEST4() Randomize For i = 1 To 3 Debug.Print Rnd(-1) Next End Sub Sub TEST5() Randomize For i = 1 To 3 Debug.Print Rnd(0) Next End Sub Sub TEST6() Randomize For i = 1 To 3 Debug.Print Rnd(2) Next End Sub
- 最左边是test1的结果 (无论点不点停止后开始,永远都是相同的)
- 第2个是test2 一直点运行的结果(rnd(1) 会取上次的,这次运行过程中会一样)
- 第3个是test2的结果
- 第4个是test3 点一次运行,点一次停止后的结果,每次都会不一样
- 第5个是test3 点一次运行,点一次停止后的结果,每次都会不一样
3.5 配合 randomize 直接用 rnd 和 rnd(-1) rnd(0) rand(1)的总结
- randomize 默认缺省会用时间当随机种子
- randomize timer
- 是一样的
- randomize 和 rnd(-1) 永远 生成相同的随机数,无论是继续生成下一个,还是重新开始随机。 参数-1 作用巨大
- randomize 和 rnd(0) 生成最近生成的数。也就是继续生成下一个的时候会是一样的上次的。重新开始也不一样,因为随机种子不同的,下次的第1个不同了!
- 但是往下运行,还是会生成和这次结束前上1个一样的
- randomize 和 rnd(1) 生成下一个数,且生成的下一个会不一样。但是,重新开始因为随机种子不同,会完全一样的随机序列。
- randomize 和rnd 同正数的
4 总结
- 如果想永远生成相同的随机数,就用rnd(-1) 但是这么做没意义吧?
- 如果想每次生成的随机数,本次程序运行结束前都一样,下次计算时不一样。就用 randmize 和 rnd(0)
- 如果想永远生成不同的随机数,无论是序列内,还是在不同的环境重新运行都不同,就用 randmize 和 rnd(1) 或 randmize 和 rnd 缺省就可以。
-
【VBA研究】VBA编程产生不重复随机数
2014-08-08 09:41:08VBA编程实现不重复随机数输出。VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了。RND取值范围是[0,1),意思是0和1之间的一个随机数,包含0,但不包含1。 1、用法 语法:Rnd[(number)] 如果...作者:iamlasong
VBA编程实现不重复随机数输出。VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了。RND取值范围是[0,1),意思是0和1之间的一个随机数,包含0,但不包含1。
1、用法
语法:Rnd[(number)]
如果 number 的值是 Randomize 生成
小于 0 ,每次都使用 number 作为随机数种子得到的相同结果。
大于 0 ,以上一个随机数为种子产生下一个随机数。
等于 0 ,产生与最近生成的随机数相同的随机数。
省略, 以上一个随机数为种子产生下一个随机数(同大于0)。
说明:
Rnd 函数返回小于 1 但大于或等于 0 的值。
number 的值决定了 Rnd 生成随机数的方式。
对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器(若带参数,则产生由参数对应的一个特定序列的随机数),该生成器具有根据系统计时器得到的种子。如果不使用Randomize 语句,那么每次执行程序时产生的随机数序列是相同的。Rnd 后面跟一个负数时,同样的参数可以得到完全相同的两个序列,例如,rnd -1执行后用rnd取1000个随机数,然后再执行rnd -1,然后再用rnd取1000个随机数,这1000个随机数和前面1000个完全相同。为了得到不同的序列,可以用不同的负数,也可以在rnd -1后面执行Randomize number。注意,要得到相同的序列,两次Randomize后面的number必须相同。这种方法用途之一就是用于加密和解密。
关于产生相同的随机序列总结一下:1、Rnd(-1)后取随机数与再次执行Rnd(-1)取的随机数相同;2、Rnd(-1)后取随机数与再次执行Rnd(-2)取的随机数不同;3、Rnd(-1)和Randomize 1后取随机数与再次执行Rnd(-1)和Randomize 1取的随机数相同;4、Rnd(-1)和Randomize 1后取随机数与再次执行Rnd(-1)和Randomize 2取的随机数不同。
为了生成某个范围内的随机整数,可使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
注意:若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。2、无重复随机数算法一
这是最简单的算法,每产生一个随机数,就和已有的比较,如果已经存在,则重新产生。比较适合从一个大范围里面抽出一小部分数据,比如,从题库中抽取试题。
' 产生20个1-100之间的不重复随机数 Public Sub RndNumberNoRepeat1() Dim RndNumber, temp(20), i, k, Maxrec As Integer 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 Exit For Next i If i = k Then k = i + 1 'MsgBox "随机数:" & RndNumber Loop End Sub
3、无重复随机数算法二
这个算法比较巧妙,需要细细体会,才能知道真谛。这个算法不会重复产生随机数,但需要一个占位数组。比较适合输出范围之内所有数值的场合,比如,随机发牌。
' 产生20个1-100之间的不重复随机数 Sub RndNumberNoRepeat2() 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) '从A21开始输出这些数字 Cells(120 - i, 1) = TempArray(RndNumber) + 1 TempArray(RndNumber) = TempArray(i) Next i End Sub
4、无重复随机数算法三
这个算法使用字典对象完成去重复,和第一个算法差不多,但程序看上去简洁一点,嗯,起码新颖一点。
' 产生20个1-100之间的不重复随机数 Sub RndNumberNoRepeat3() 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
附:VBA中Dictionary对象使用小结
Dim dict
' 创建Dictionary
Set dict = CreateObject("Scripting.Dictionary")
' 增加项目
dict.Add "A", 300
dict.Add "B", 400
dict.Add "C", 500
' 统计项目数
n = dict.Count
' 删除项目
dict.Remove ("A")
' 判断字典中是否包含关键字
dict.exists ("B")
' 取关键字对应的值,注意在使用前需要判断是否存在key,否则dict中会多出一条记录
Value = dict.Item("B")
' 修改关键字对应的值,如不存在则创建新的项目
dict.Item("B") = 1000
dict.Item("D") = 800
' 对字典进行循环
k = dict.keys
v = dict.Items
For i = 0 To dict.Count - 1
key = k(i)
Value = v(i)
MsgBox key & Value
Next
' 删除所有项目
dict.Removeall实例:
Sub 宏1()
Set dic = CreateObject("Scripting.Dictionary") '字典
For i = 1 To 10000
If Not i Like "*4*" Then
dic.Add i, "" '如果不包含“1”
End If
Next
Range("a2").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.keys) '从A2单元开始向下放置
End Sub
=========================================================================
又 Tranpose工作表函数的用法实例
'把一行多列的二维数组转换成一维数组
Sub test()
Dim arr, arrt
arr = Range("a1:j1")
arrt = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))
Stop
End Sub
首先看看TRANSPOSE函数的基础用法。官方帮助说明,TRANSPOSE函数可返回转置单元格区域,即将行单元格区域转置成列单元格区域,反之亦然。
TRANSPOSE函数语法是:TRANSPOSE(array)
Array参数是需要进行转置的数组或工作表上的单元格区域。所谓数组的转置就是,将数组的第一行作为新数组的第一列,数组的第二行作为新数组的第二列,以此类推。 -
VBA编程产生不重复随机数(转载)
2019-06-04 14:39:27Randomize (Timer) '初始化随机数生成器 Maxrec = 100 ’ 从A21开始输出随机数 k = 0 Do While k RndNumber = Int(Maxrec * Rnd) + 1 temp(k) = RndNumber Cells(k + 21, 1) = RndNumber For i = 0 To k -... -
如何产生固定的随机数(VBA)
2008-08-17 11:30:00实际上,是很多使用Excel 的朋友有这样的需求,希望能产生一些随机数,大家知道可以用Rand函数来产生它,但是这个函数是易失的,就是说会不断地计算。朋友们可能希望第一次让它随机产生,而后就固定了。所以,这就... -
excel随机函数出来的数相加等于一个想要的固定值比如产生20个随机数想加等于200而且每个数都不大于3最好用...
2020-12-20 08:42:30Option ExplicitFunction getRandom(total As Integer, max As Integer, num As Integer) As Boolean'total是最后要得到的总和,max是最大不能超过的数,num是产生多少个随机数Dim ranNum As Single '随机数Dim ... -
三个vba生成不重复随机整数的案例
2016-08-15 17:52:20内容提要:文章提供三个vba代码生成不重复随机数的案例供学习。对Excel感兴趣的朋友可加Excel学习交流群:284029260(www.itblw.com) vba不重复随机数案例一: 下面的代码,将在A1:A5000单元格产生1-5000的不... -
Excel VBA - 数组及其他知识
2011-10-29 22:46:00数组:定义数组: Dim arr(30 To 50) As Single 定义数组,从30到50,定义为浮点型~ arr(30) = 34.3 ...产生随机数,但是随机数要不同(1到20之间产生10个不同的随机数) Sub sdlkfjl... -
【VBA研究】生成随机密码
2015-08-11 17:19:37函数实现的流程是:用一个变量保存所有用到的字符,然后根据级别取不同的子串,最后产生随机数,从子串中取出字符合并出随机密码。程序如下: '生成密码并保存到当前工作表中 Sub GetPassword() ... -
vba调用mysql随机出题软件_题库需要随机进行出题
2021-01-30 12:34:33Function 随机试题() '产生随机数代码,40个随机数字从1~100中取'1、声明变量Dim dx As Integer '随机单选题数值Dim dxjh As New Collection '随机单选题数值集合,不重复Dim dxzsl As Integer '单选题库总数量Dim ... -
【VBA研究】Rnd和Randomize的关系和理解
2017-04-10 11:23:361、程序中如果只用Rnd取随机数时,每次执行都会产生相同的随机数序列。 2、Randomize可以让每次执行程序产生不同的序列,因为该语句用计时器当前值做随机序列的种子。 3、同一个程序中Randomize number执行两次... -
EXCEL随机数据 如何使用使用Excel VBA或单元格表达式快速生成随机数据
2020-09-18 10:31:28产生两个及更多范围的随机数。可以用于制作一份随机数据或随机表单。一共讲解了RANDBETWEEN()、RAND()、CHOOSE()、CHAR()、Round()、Trim()、Chr()、Str()、DataSerial()、TimeSerial()、Foramt()这11个Excel函数的... -
Excel之产生不重复的随机整数
2017-11-29 15:10:12我们知道rand或者randbetween函数可以产生随机数,但是如果我们想要产生完全不重复的数该怎么办呢? 这时我们可以用VBA来解决问题。 按alt+f11打开宏编辑器,点选要处理的sheet. 新建脚本,粘贴内容如下:Sub t()... -
excel vba 不等于_Excel设置重要文档自动生成随机校验码,禁止用其他机器改动重印...
2020-11-22 23:58:32导读:一、校验码的防伪原理,二、校验码的应用需求,三、Excel生成校验码的方法,四、使用效果...校验码的生成,是通过随机数产生函数来实现的,即在每次操作的同时系统产生一个随机的不规则的唯一的数,不同机器... -
矿井风网瓦斯流可视化分析系统
2020-06-13 07:00:16瓦斯流分析部分利用直方图法绘图,最小二乘法拟合曲线,χ2(k-1)分布函数对曲线拟合性检验,结合蒙特卡洛法及随机数的产生方法,对瓦斯流量进行随机取样,进一步验证曲线拟合性,最终得到瓦斯流量概率分布函数,从而确定每... -
《Excel实战技巧精粹》示例文件 光盘文件
2012-02-24 15:37:04│ │ 技巧195 产生规定范围内的随机数.xls │ │ 技巧196 求解多元一次方程.xls │ │ 技巧197 求出成绩最高分.xls │ │ │ ├─第20章-统计求和 │ │ 技巧198 设置目标数据的上下限.xls │ │ 技巧199 ... -
VBSCRIPT中文手册
2010-11-12 10:13:06Raise 方法 产生运行时错误。 Randomize 语句 初始化随机数发生器。 ReDim 语句 声明动态数组变量,并分配或重新分配过程级的存储空间。 RegExp 对象 提供简单正则表达式的支持。 Rem 语句 包含程序中的注释。 ... -
vb Script参考文档
2009-07-28 22:13:02Raise 方法 产生运行时错误。 Randomize 语句 初始化随机数发生器。 ReDim 语句 声明动态数组变量,并分配或重新分配过程级的存储空间。 RegExp 对象 提供简单正则表达式的支持。 Rem 语句 包含程序中的注释。 ... -
VBSCRIP5 -ASP用法详解
2010-09-23 17:15:46Raise 方法 产生运行时错误。 Randomize 语句 初始化随机数发生器。 ReDim 语句 声明动态数组变量,并分配或重新分配过程级的存储空间。 RegExp 对象 提供简单正则表达式的支持。 Rem 语句 包含程序中的注释。 ... -
VBScript 语言参考中文手册CHM
2009-04-18 12:32:49Raise 方法 产生运行时错误。 Randomize 语句 初始化随机数发生器。 ReDim 语句 声明动态数组变量,并分配或重新分配过程级的存储空间。 RegExp 对象 提供简单正则表达式的支持。 Rem 语句 包含程序中的注释。 ... -
VBScript 语言参考
2008-10-07 21:30:05Raise 方法 产生运行时错误。 Randomize 语句 初始化随机数发生器。 ReDim 语句 声明动态数组变量,并分配或重新分配过程级的存储空间。 RegExp 对象 提供简单正则表达式的支持。 Rem 语句 包含程序中的注释。 ... -
EXCEL集成工具箱完整版 (简体/繁体/英文多国语言版) V7.0
2010-08-13 10:31:10Excel集成工具箱7.0是利用VBA(Visual Basic for Applications)语言编写的增强应用型插件。包括160个菜单功能和100个左右自定义函数,集160个工具于一身,但体积小于15MB。当安装集成工具箱后,如果您使用Excel ... -
EXCEL集成工具箱V6.0
2010-09-11 01:44:37Excel集成工具箱6.0是利用VBA(Visual Basic for Applications)语言编写的增强应用型插件。包括160个菜单功能和100个左右 自定义函数,集160个工具于一身,但体积小于15MB。当安装集成工具箱后,如果您使用Excel ... -
EXCEL集成工具箱V8.0 多国语言版(2003-2010通用)
2010-09-11 12:08:58Excel集成工具箱8.0是利用VBA(Visual Basic for Applications)语言编写的增强应用型插件。包括160个菜单功能和100个左右 自定义函数,集160个工具于一身,但体积小于15MB。当安装集成工具箱后,如果您使用Excel ... -
EXCEL集成工具箱V8.0完整增强版(精简)
2010-09-23 16:58:17Excel集成工具箱8.0是利用VBA(Visual Basic for Applications)语言编写的增强应用型插件。包括160个菜单功能和100个左右 自定义函数,集160个工具于一身,但体积小于16MB。当安装集成工具箱后,如果您使用Excel ...