vb/vba抽取不重复随机数

vb/vba 抽取随机数可以用Rnd函数,但它只是一个最基本最简单的随机函数,结果是0到1之间的小数。若要限定范围,限定小数位数,还需要写其他代码控制。例如要抽取1到100的随机整数数,代码如下:

int(Rnd()*99) + 1

Rnd函数得到的结果是0到1,乘以99就得到0到99范围的数。再用int函数取整和加上1,就可以得到1到100范围内的随机整数。

这样,我就可以反复利用这句代码得到多个1到100之间的随机整数。但这些随机数可能会重复。

若我们想在1到100之间抽取10个不重复的随机整数。这句代码就实现不了,得另寻他路。

这里可以采用数组法。因为数组有两个值:一个是数组下标;一个是数组的值。

这样我们可以对数组下标进行随机抽取。每次抽取之后的值拿出来,再调整数组下标要抽取的范围。这样就可以实现不重复抽取随机数。

举个例子,现有数字1到6,要不重复随机抽取3个数字。

将其放在1个数组中,进行第1次抽取。如下图:

按照这种方法,继续第2次抽取随机数,再把抽取出来的值调整到前面。如下图:

也有可能抽取的随机数刚好在其范围的第1位,无需交换。第3次抽取,如下图:

这样就可以获取该数组的前3个元素。这3个元素就是不重复的随机抽取结果。

根据这个思路,写了一个函数(这个已经可以归为是算法了),代码如下:


'抽取不重复随机数函数'
'参数1:arr,数组,抽取随机数的样本(数据源)'
'参数2:lngNum,长整数,要抽取的个数'
Public Function RndSample(arr(), lngNum As Long)
    '判断要获取的个数'
    Dim lngLength As Long
    lngLength = UBound(arr) - LBound(arr) + 1     '获取长度'

    '若要获取随机数的个数大于等于数组长度,直接返回整个数组'
    If lngNum >= lngLength Then
        RndSample = arr
        Exit Function
    End If

    '随机数的个数不能少于1个'
    If lngNum < 1 Then lngNum = 1

    '抽取随机数'
    Randomize               '重置随机器'
    Dim lngRnd As Long      '用于存在返回的随机数'
    Dim varTemp As Variant  '两个变量调换的中间临时变量'
    Dim lngTimes As Long    '记录第几次抽取'
    lngTimes = 1
    
    Do
        '抽取lngTimes-1 ~ lngLength范围的随机数'
        lngRnd = Int(Rnd() * (lngLength - lngTimes)) + lngTimes - 1

        '调换值,将抽取到的随机数下标对应的值放到前面'
        '之所以放到前面,是为了方便返回结果'
        varTemp = arr(lngTimes - 1)
        arr(lngTimes - 1) = arr(lngRnd)
        arr(lngRnd) = varTemp

        '继续抽取'
        lngTimes = lngTimes + 1
    Loop While lngTimes <= lngNum

    '返回结果,截取抽取的随机数个数,Preserve 关键字作用是ReDim重新定义不清除值'
    ReDim Preserve arr(lngNum - 1)
    RndSample = arr
End Function

再写个测试代码:

Public Sub test()
    Dim arr(), re()
    'arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)'
    arr = Array("A", "B", "C", "D", "E")
    re = RndSample(arr, 3)
    
    Dim i As Long
    For i = 0 To UBound(re)
        Debug.Print re(i)
    Next
End Sub

给RndSample函数,传递两个参数,第一个是抽取随机数的样本(数据源)数组,第二个参数是要抽取的个数。

该数组可以是纯数字,也可以是文本,也可以是数字和文本混搭。

测试通过,可以得到不重复随机数 ^_^ (还是Python好,可以用Random模块中的Sample方法直接得到不重复的随机数)

聚圣源网站世界排名鼠年李姓起名叶薇薇女孩子缺水起什么名字高端化妆品商标起名字廊坊哪里起名字比较好爸爸活姓张狗年宝宝起名大全女性起名名字大全山里汉宠妻无度全文免费宝宝起名 千明双胞胎女孩免费起名变身小姐童装店起什么店名电商公司起名参考足球比分直播500完整版黄连厚朴姓穆的女孩起名通报批评范文电视剧起名升迁有道挂名法人起诉实际控制人单字起名字肖邦简介四个字起名测试黑龙江电视台在线直播丹字起名女孩名字方姓如何起名字货币战争pdf起名字刘艺什么淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化

类似日志

  • 没有类似日志

评论列表

暂无评论,欢迎来抢沙发!

新的评论

清空

聚圣源网站世界排名鼠年李姓起名叶薇薇女孩子缺水起什么名字高端化妆品商标起名字廊坊哪里起名字比较好爸爸活姓张狗年宝宝起名大全女性起名名字大全山里汉宠妻无度全文免费宝宝起名 千明双胞胎女孩免费起名变身小姐童装店起什么店名电商公司起名参考足球比分直播500完整版黄连厚朴姓穆的女孩起名通报批评范文电视剧起名升迁有道挂名法人起诉实际控制人单字起名字肖邦简介四个字起名测试黑龙江电视台在线直播丹字起名女孩名字方姓如何起名字货币战争pdf起名字刘艺什么淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化