打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA产生特定范围内的随机数 | VBA实例教程

除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www.zhanzhanrufeng.com/cat4/292.html,VBA交流群273624828。

在工作中我们有时会碰到一些随机问题,比如随机排序、随机抽取等,在Excel VBA中解决这些问题的基础都是要先产生一系列的随机数,今天我们就来看下怎么利用VBA来产生符合我们需要的随机数。在Excel表格中产生随机数的函数是Rnd,在VBA中的随机函数也是Rnd,Rnd函数产生的随机数的范围是[0,1),包括0但不包括1,那么通过对这个范围的运算就可以得到符合我们要求的范围。下面来看一下怎样随机产生[1,1000]之间的随机数。

Sub 随机数()
'在[1,1000]之间随机产生100个整数,可重复
Dim arr(1 To 100), i
Randomize
For i = 1 To 100
arr(i) = Int((Rnd * 1000) + 1)  'Rnd[0,1)
Next
Range("A1").Resize(100, 1) = Application.Transpose(arr)
End Sub

在程序中我们先用了Randomize初始化随机数,对此我简单解释一下,首先要知道的是程序产生的随机数并不是真正的随机数,它是程序通过一定的算法算出来的,那么要算这么一串数值就需要有一个初始的值,如果我们不去管它,那这个初始值就是一个系统默认的固定值(是多少我也不知道),算出来的序列也是固定的,而这个序列是我们取数的池子,假设这个池子是(1,2,3,4,5),你取两次,每次两个随机数,第一次可能是(2,3),第二次可能是(3,4),但是3是决不可能出现在2之前的,所以你的随机性就大打折扣了。Randomize就是利用当前时间来对这个初始值进行初始化,因为时间一直增大,不可能产生相同的情况,所以随机性就更好一些。这些也只是我自己的理解,有错误的地方欢迎指正,当然这个问题也不必深究,会用即可。

前面说了Rnd是[0,1),那Rnd*1000+1就是[1,1001),再用Int函数取整就是[1,1000]了,将这些数暂存数组,最后放到A列。

上面抽取的100个数是有可能存在重复的数值,那如果我们需要产生100个不重复的数值怎么办呢,比如我们要从1000道题中随机抽100道题?这时就想到了我们之前讲过的字典,下面来看怎么用

Sub 不重复随机数()
Dim arr(1 To 100), i, d, x
Set d = CreateObject("scripting.dictionary")
Randomize
Do While i < 100
x = Int((Rnd * 1000) + 1)
If Not d.exists(x) Then
i = i + 1
arr(i) = x
End If
Loop
Range("B1").Resize(100, 1) = Application.Transpose(arr)
End Sub

上面代码定义了一个字典d,先将产生的随机数放到一个临时的变量x中,然后判断字典是是否存在x,如果不存在,则说明x是第一次出现,那将它保存在数组中,如果已经存在了就说明重复了,我们就重新取数,很简单,不再多说。

上面的代码直接复制到模块中即可观察效果,我不再上附件了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VBA编程实现不重复随机数输出
VBA在指定范围内生成随机数、随机整数
rnd 随机数
VBScript Rnd 函数
使用ASP产生随机数
vbs Randomize用法详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服