|
香川群子 发表于 2012-6-20 21:06
占楼。下面是【经典数组洗牌法】实际代码功能扩展的代码例子:
一维数组arr,从其中第a个元素开始,到第 ...
香川,我喜欢看你的帖子~
对于本贴9楼中的问题:
一维数组arr,从其中第a个元素开始,到第b个元素为止的区间内,任意抽取n个不重复值返回。
其中,n<=b-a+1 即n可以正好和a-b中元素个数相等,或小于a-b区间中的元素个数。
你给出的洗牌算法是:- Sub GetRnd(arr, a, b, n)
- Randomize
- l = LBound(arr)
- For i = l To n + l - 1 '正序洗牌
- r = Int(Rnd() * (b - a + 1 - (i - l))) + a + (i - l)
- t = arr(r, 1)
- arr(r, 1) = arr(i + a - l, 1)
- arr(i, 1) = t '下标1开始一维代码
- Next
- End Sub
复制代码 这里我有点不理解的是,arr(r)为什么要用 arr(i + a - l)填充?
像如下两种写法应该也是满足要求的,你是不是有别的什么用意?- Sub GetRnd(arr, a, b, n)
- Randomize
- s = LBound(arr)
- For i = s To n + s - 1 '正序洗牌
- r = Int(Rnd() * (b - a + 1 - (i - s))) + a + (i - s)
- t = arr(r, 1)
- arr(r, 1) = arr(i, 1)
- arr(i, 1) = t '下标1开始一维代码
- Next
- End Sub
复制代码- Sub GetRnd(arr, a, b, n)
- Randomize
- s = LBound(arr)
- For i = 1 To n '正序洗牌
- r = Int(Rnd() * (b - a - i + 1)) + a + i
- t = arr(r + s - 1, 1)
- arr(r + s - 1, 1) = arr(i + s - 1, 1)
- arr(i + s - 1, 1) = t '下标1开始一维代码
- Next
- End Sub
复制代码 |
|