旧版VBA数组洗牌无重复的原因咨询
旧版VBA洗牌算法无重复的原因解析
先看你这段洗牌代码:
x = Array(679, 680, 683, 781, 790, 792, 800, 801, 809, 818, 822, 871, 897, 911, 913, 924, 927, 929, 930, 934, 936, 946, 951, 952, 956, 970, 971) Dim i As Long For i = UBound(x) To LBound(x) Step -1 Dim t As Variant t = x(i) Dim j As Long j = CLng((25 - 0 + 1) * Rnd + 0) x(i) = x(j) x(j) = t Next i
为什么不会出现重复?
核心原因很直白:这段代码只是交换原数组里已有元素的位置,完全没有修改元素本身的值,也没有新增或删除元素。
- 你初始化的原数组本身就是27个不重复的唯一值
- 循环逻辑是从数组最后一个元素开始,把当前位置的元素和随机选中的另一个位置元素互换
- 整个过程中,数组里的元素始终是原来那27个值,只是顺序被打乱而已
不管交换多少次,元素池没有变化,自然不会出现重复数字。
补充:代码里的小问题
你写的j = CLng((25 - 0 + 1) * Rnd + 0)会生成0到25的随机索引,但原数组的最大索引是26(因为有27个元素,VBA默认数组从0开始),所以当i=26时,j永远选不到26,这属于Fisher-Yates洗牌的非标准实现,随机性会有轻微偏差,但不影响“无重复”的结果。
内容的提问来源于stack exchange,提问作者G G Synaptic
相关产品推荐
相关产品推荐

