ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: toopoor

[原创] 生成不重复随机数的一段代码

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-1-31 19:26 | 显示全部楼层
原帖由 lsftest 于 2011-1-29 21:14 发表

呵呵,测试的结果是,运算不如交换快。。。
Private Sub CommandButton2_Click()
...


嗯,我现在最感兴趣的是:如何检验上面所有算法的随机性,是一样好,还是不一样。

TA的精华主题

TA的得分主题

发表于 2011-3-14 12:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个有意思

TA的精华主题

TA的得分主题

发表于 2011-3-30 14:48 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-4 09:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-8 20:56 | 显示全部楼层
40楼的代码,min=1,max=10,n=9的时候,为什么产生的随机数会有0而且有时会重复呢?而且有时还会有死机现象。

TA的精华主题

TA的得分主题

发表于 2011-9-9 14:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
pqr19661003 发表于 2011-9-8 20:56
40楼的代码,min=1,max=10,n=9的时候,为什么产生的随机数会有0而且有时会重复呢?而且有时还会有死机现象。 ...

我检查了一下,发觉Zamyi大侠有一句代码错了:

第二循环得到t2值以后,
赋值语句的对象错了: b(t + t2) = b(t) + t2

实际应该是: b(m + 1) = b(t) + t2


TA的精华主题

TA的得分主题

发表于 2011-9-9 16:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
进一步检查了一下,发现有好几处bug

第一个bug:
b(0) = Int((2 * Int((Max - b(m) + 1) / (n - m))) * Rnd())

显然计算结果=0的可能性存在。

改正方法为,+ Min 保证>=最小值。
b(0) = Int((2 * Int((Max - b(m) + 1) / (n - m))) * Rnd()) + Min

第二个bug,
第一次分配以后如果不足,
则需要搜寻间隔过大的继续插入,
然而,产生了问题:t2 = Int(t1 * Rnd()) + 1
则会产生正好等于下一个值的错误。

应更正为:t2 = Int((t1 - 1) * Rnd()) + 1


第3个bug:
随机数寻找插值位置时,陷入“死循环”:
t = Int((n - 2) * Rnd()) + 1
由于t>=1,则永远不会去检查b(0)-b(1)区间是否可以插值。

第4个bug:
如果一开始b(0)>Min时,则再也无法从Min值开始插值。
当取样数等于,或非常接近样本个数时,非常有可能进入“死循环”。
(即取样个数和样本个数差值小于等于b(0)-Min时)


…………
最后改正的代码是:
  1. Public Sub test3()
  2.     Dim a(), b() As Double
  3.     Dim Min, Max, m, n, B0, Fd, Cou, i1, i2
  4.     tm = Timer
  5.     Min = [a2]
  6.     Max = [b2] '5 * 10 ^ 10
  7.     n = [c2] '5 * 10 ^ 6
  8.     Cou = Max - Min + 1
  9.     ReDim b(n - 1)
  10.     b(0) = Int((2 * Int((Max - b(m) + 1) / (n - m))) * Rnd()) + Min '+Min ⇒Else b(0)=0 Err!
  11.     Do While m < n - 1
  12.        t = Int((2 * Int((Max - b(m) + 1) / (n - m))) * Rnd()) + 1
  13.        If b(m) + t > Max Then Exit Do
  14.        m = m + 1
  15.        b(m) = b(m - 1) + t
  16.     Loop
  17.       
  18.     For i = 1 To n - 1 - m
  19.       Do
  20.         ct = ct + 1 'ct confirm Else Dead Cycle Err!
  21.         If ct > Max Then
  22.             If b(0) - Min > 0 Then
  23.                 t = m + 1
  24.                 t1 = b(0) - Min
  25.             Else
  26.                 For t = 0 To n - 2
  27.                     If b(t + 1) - b(t) > 1 Then
  28.                         t1 = b(t + 1) - b(t)
  29.                         Exit For
  30.                     End If
  31.                 Next
  32.             End If
  33.             Exit Do
  34.         End If
  35.         
  36.         t = Int((n - 1) * Rnd()) 't = Int((n - 2) * Rnd()) + 1&#8658;b(0) can't be select Err!
  37.         t1 = b(t + 1) - b(t)
  38.       Loop Until t1 > 1
  39.       t2 = Int((t1 - 1) * Rnd()) + 1 't2 = Int(t1 * Rnd()) + 1&#8658;will be equal b(t+1) Err!
  40.       If b(t) + t2 < Min Then
  41.         MsgBox b(t) + t2
  42.       Else
  43.         b(m + 1) = b(t) + t2 'b(t + t2) = b(t) + t2 &#8658; position select Err!
  44.       End If
  45.       
  46.     Next
  47.    
  48.     For i = n - 1 To 0 Step -1
  49.       t = Int((i + 1) * Rnd())
  50.       t1 = b(t)
  51.       If t1 = 0 Then
  52.         MsgBox t1
  53.       End If

  54.       b(t) = b(i)
  55.       b(i) = t1
  56.     Next
  57.     [e1] = Format(Timer - tm, "0.00")
  58.     [b5].Resize(n + 20) = ""
  59.     [b5].Resize(n) = Application.Transpose(b)
  60. End Sub
复制代码
比原来要复杂一些了。


不重随机.zip

14.55 KB, 下载次数: 199

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-9-9 22:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯,学习哦

TA的精华主题

TA的得分主题

发表于 2012-6-25 10:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
都是高手啊,值得学习

TA的精华主题

TA的得分主题

发表于 2012-7-9 20:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
高人真多!学习了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 19:04 , Processed in 0.040984 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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