|
随机不重复部分使用【经典数组洗牌算法】非常简洁:
For i = 1 To n
r = Int((m - i + 1) * Rnd) + i
t = arr(r, 1): arr(r, 1) = arr(i, 1): arr(i, 1) = t
Next
代码算法解释:
For i = 1 To n '循环遍历抽取n个不重复值
r = Int((m - i + 1) * Rnd) + i '从剩余m-i+1个数中获取随机数。由于此范围是变动的,可保证不重复。
t = arr(r, 1) '随机抽到的r位置值存入临时变量t
arr(r, 1) = arr(i, 1) '当前第 i 个值写入r位置(本次随机值)
' → 这个过程不仅避免遗漏、和重复,还能顺便打乱顺序,效率非常之高。
arr(i, 1) = t '临时变量t中存放的r位置随机值,写入当前 i位置 完成交换。
Next
详细解释抽取过程中剩余数和位置区间关系:
标题: i 值 剩余个数 随机抽取范围 已排除区间
计算: i m-i+1 [i , m] [0, i-1]
1 m [1, m] [0, 0]
2 m - 1 [2, m] [0, 1]
3 m - 2 [3, m] [0, 2]
4 m - 3 [4, m] [0, 3]
…………
m-2 3 [m-2, m] [0, m-3]
m-1 2 [m-1, m] [0, m-2]
m 1 [ m , m] [0, m-1]
这样就明白了吧! |
评分
-
查看全部评分
|