|
本帖最后由 小花鹿 于 2012-6-21 00:06 编辑
香川群子 发表于 2012-6-20 21:01
接3楼。
【经典数组洗牌法】的真正原理是:
先理解了这个例子再说。
根据你的讲解,我写了一段代码:
Sub test()
Dim i&, ar(1 To 10), br(1 To 3), r&, tm&
For i = 1 To 10
ar(i) = i
Next i
For i = 1 To 3
r = Int(Rnd * (10 - i + 1)) + i
tm = ar(i)
ar(i) = ar(r)
ar(r) = tm
br(i) = ar(i)
Next i
[a1:c1] = br
End Sub
目的是从按大小排列的1到10的数组ar中随机抽取不重复的3个元素,按你的讲解我也解释一下,请指导:
i 是从1 到3循环的,
当 i=1 时,10-i+1=10 ,由于0<=rnd<1,所以 Int(Rnd * (10 - i + 1)) 得到的结果是0到9,加上 i 后是1到10,即 r=1到10,从第1到第10个元素中抽取,假设 r=6,即抽取了第6个元素,通过下面的一系列赋值 ar 数组的结果是 6,2,3,4,5,1,7,8,9,10
当 i=2 时,10-i+1=9,由于0<=rnd<1,所以 Int(Rnd * (10 - i + 1)) 得到的结果是0到8,加上 i 后是2到10,即 r=2到10,即从第2到第10个元素中抽取,由于 r 不可能等于1,所以第1个元素6是根本抽不到的,这就避免了重复抽取,假设这时 r=5,即抽取第5个元素,通过下面一系列的赋值 ar 数组就变成了这样的,6,5,3,4,2,1,7,8,9,10
当 i=3 时,10-i+1=8, Int(Rnd * (10 - i + 1)) 得到的结果是0到7,加上 i 后是3到10,即 r=3到10,从第3到第10个元素中抽取,由于同样的原因,处于第1,2位的6和5是抽不到的,假设这时 r=9,经过赋值后 ar 变成了这样的,6,5,9,4,2,1,7,8,3,10
在这里,最重要的是两方面,一是要确定 r 的取值范围,这由Int(Rnd * (10 - i + 1)) + i 决定,这个范围一定要把已经取出的元素排除在外,二是当确定了取哪个元素后,要重新对已取出的和未取过的元素进行摆放,从而将两者分开,以便于后面方便确定取值范围。
注:我这里的 br 数组是多余的。
|
评分
-
1
查看全部评分
-
|